第五章 嵌入式Linux應用開發基礎(2)

 

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 100ask_imx6ull-sdk.7z文件夾內容

    解壓之後先放在原有文件夾之中吧,看下里面都有哪些文件夾,如圖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文檔

    參照在線文檔下載視頻配套文檔:

圖5.10-1 git視頻文檔操作
圖5.10-2 配套文件目錄

    後來在看高級手冊時發現可以在線下載就想改用在線下載,折騰半天發現都不行,才發現在線下載說的是源碼,就是uboot、kernel等,,,

5.6.2Git源碼

    開始用的百度雲盤,那叫一個慢啊!4.36G,得下載24個小時!後來改用在線,很快!

    高級手冊寫的簡單一些,可以參照入門手冊9.1.2:

圖5.10-3在線下載源碼

 5.6.1問題及解決

1、安裝p7zip出現錯誤,如圖5.11,網絡上解決方案但是都不行,重啓的Ubuntu就可以了。

圖5.11 p7ip安裝錯誤提示

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.13 開發板上Hello程序

 到此可以在開發板上執行可執行程序了……

 

5.8 Hello.c分析

 幾個問題:

  1. .h的作用?Declare,給編譯器看,程序中將會用到.h中的函數;
  2. .c的作用?Define,從.h中調用過來實現功能;
  3. 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,預處理就是展開所有的頭文件、替換程序中的宏、解析條件編譯並添加到文件中。編譯是將經過預編譯處理的代碼編譯成彙編代碼,也就是我們常說的程序編譯。彙編就是將彙編語言文件編譯成二進制目標文件。鏈接就是將彙編出來的多個二進制目標問價鏈接在一起,形成最終的可執行文件,鏈接的時候還會涉及到靜態庫和動態庫等問題。

圖5.14 GCC編譯過程

很有用的選項:

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會用  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章