5.6下載源碼
參見高級手冊3.1,通過FileZilla工具上傳資料光盤中的(07_bsp_sdk/100ask_imx6ull-sdk.7z.001和.002)整個文件夾到ubuntu系統/home/book目錄下。執行 7z x 100ask_imx6ull-sdk.7z.001解壓縮文件,前提是先安裝了p7zip解壓軟件,
sudo apt-get install p7zip-full
Win10中解壓2個壓縮文件夾時,只需要解壓一個即可,Linux下也是,
7z x 100ask_imx6ull-sdk.7z.001
解壓之後先放在原有文件夾之中吧,看下里面都有哪些文件夾,如圖5.10,Linux-4.9.88應該是內核,Uboot是bootloader,Yocto_rocko開源項目,具體未知,ToolChain是交叉編譯工具文件夾,gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf是交叉編譯器文件夾。把Uboot和內核文件夾用FileZilla傳回win10後面需要用,會傳很長時間,耐心等待。
另,不要在win10下解壓,說是路徑太深,會出現很多報錯,我試過。
後來補充:
5.6.1Git文檔
參照在線文檔下載視頻配套文檔:
後來在看高級手冊時發現可以在線下載就想改用在線下載,折騰半天發現都不行,才發現在線下載說的是源碼,就是uboot、kernel等,,,
5.6.2Git源碼
開始用的百度雲盤,那叫一個慢啊!4.36G,得下載24個小時!後來改用在線,很快!
高級手冊寫的簡單一些,可以參照入門手冊9.1.2:
5.6.1問題及解決
1、安裝p7zip出現錯誤,如圖5.11,網絡上解決方案但是都不行,重啓的Ubuntu就可以了。
5.7配置交叉編譯工具鏈
參見高級手冊3,2,Ubuntu 自帶的 gcc 編譯器是針對 X86 架構的!要編譯ARM架構的代碼,需要在X86的架構上安裝一個ARM編譯器,交叉編譯器,交叉編譯器中“交叉”的意思就是在一個架構上編譯另外一個架構的代碼,相當於兩種架構“交叉”起來了。
免費版目前有三大主流工具商提供,第一是GNU(提供源碼,自行編譯製作),第二是 Codesourcery,第三是Linora。arm-linux-gnueabihf-gcc:是由 Linaro 公司基於GCC推出的的ARM交叉編譯工具。可用於交叉編譯ARM(32位)系統中所有環節的代碼,包括裸機程序、u-boot、Linux kernel、filesystem和App應用程序。
設置交叉編譯工具主要是設置 PATH, ARCH 和 CROSS_COMPILE 三個環境變量,永久生效的設置方法:
vim ~/.bashrc
在行尾添加或修改:
export ARCH=arm
exportCROSS_COMPILE=arm-linux-gnueabihf
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/Linux-4.9.88/gcc-linaro-6.2.1-
2016.11-x86_64_arm-linuxgnueabihf/bin
測試環境變量:
book@100ask:~$ echo $ARCH
arm
book@100ask:~$ echo $CROSS_COMPILE
arm-linux-gnueabihf-
根據手冊測試下是否安裝成功,成功後使用交叉編譯器編譯hello.c,把生產的hello複製到/home/book/nfs_rootfs目錄下,
arm-linux-gnueabihf-gcc -o hello hello.c
用NFS服務把hello掛載到開發板上執行./hello,成功,打印:Hello, world!
到此可以在開發板上執行可執行程序了……
5.8 Hello.c分析
幾個問題:
- .h的作用?Declare,給編譯器看,程序中將會用到.h中的函數;
- .c的作用?Define,從.h中調用過來實現功能;
- Gcc和arm-gcc對應的stdio.h存放在哪裏?Gcc是系統自帶的編譯器,一般會存放在/usr/include中;
那arm-gcc應該也存放在對應的編譯器文件夾中。
使用<>意思是去默認路徑中找.h文件,但是有的.h文件是自己編寫的,並沒有放到默認庫中,這時候這個.h文件就要用“”包含,或者繼續用<>,但是編譯時需要加上-I選項,例如:arm-linux-gnueabihf-gcc -o hello hello.c -I ./,意思是到當前目錄找頭文件。
4. printf函數存放在哪裏?編譯器默認的lib目錄,/libc/usr/lib、/libc/lib和/lib中都有,也可以自己指定,-L選項爲指定目錄,-l選項爲指定庫。
5.9 GCC 編譯器的使用
GCC 編譯器的編譯流程是:預處理(preprocessing)、編譯(compilation)、彙編(assembly)和鏈接(linking)。如圖5.14,預處理就是展開所有的頭文件、替換程序中的宏、解析條件編譯並添加到文件中。編譯是將經過預編譯處理的代碼編譯成彙編代碼,也就是我們常說的程序編譯。彙編就是將彙編語言文件編譯成二進制目標文件。鏈接就是將彙編出來的多個二進制目標問價鏈接在一起,形成最終的可執行文件,鏈接的時候還會涉及到靜態庫和動態庫等問題。
很有用的選項:
gcc -E main.c // 查看預處理結果,比如頭文件是哪個
gcc -E -dM main.c > 1.txt // 把所有的宏展開,存在1.txt裏
gcc -Wp,-MD,abc.dep -c -o main.o main.c // 生成依賴文件abc.dep,後面Makefile會用