嵌入式開發之交叉編譯程式萬能命令_以freetype為例
6.4 交叉編譯程式:以freetype為例
使用buildroot來給ARM板編譯程式、編譯庫會很簡單,
以後系統講解buildroot時再使用buildroot。
現在我們還是手工交叉編譯freetype,這種方法在編譯、安裝一些小程式時很有用。
6.4.1 程式執行的一些基礎知識
編譯程式時去哪找標頭檔案?
系統目錄:就是交叉編譯工具鏈裡的某個include目錄;
也可以自己指定:編譯時用 “ -I dir ”選項指定。
連結時去哪找庫檔案?
系統目錄:就是交叉編譯工具鏈裡的某個lib目錄;
也可以自己指定:連結時用 “ -L dir ”選項指定。
執行時去哪找庫檔案?
系統目錄:就是板子上的/lib、/usr/lib目錄;
也可以自己指定:執行程式用環境變數LD_LIBRARY_PATH指定。
執行時不需要標頭檔案,所以標頭檔案不用放到板子上
6.4.2 常見錯誤的解決方法
1。標頭檔案問題
編譯時找不到標頭檔案。在程式中這樣包含標頭檔案:#include
對於尖括號裡的標頭檔案,去哪裡找它?
系統目錄:就是交叉編譯工具鏈裡的某個include目錄;
也可以自己指定:編譯時用 “ -I dir ”選項指定。
怎麼確定“系統目錄”?
執行下面命令確定目錄:
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v -
它會列出標頭檔案目錄、庫目錄(LIBRARY_PATH)。
你需要在標頭檔案目錄中確定有沒有這個檔案,或是自己指定標頭檔案目錄。
2。庫檔案問題
連結程式時如果有這樣的提示:undefined reference to `xxx’,它表示xxx函式未定義。
那麼解決方法有2:
① 去寫出這個函式
② 或是使用庫函式,那需要在連結時指定庫
怎麼指定庫?想連結libabc。so,那連結時加上:-labc。
庫在哪裡?
① 系統目錄:就是交叉編譯工具鏈裡的某個lib目錄
② 也可以自己指定:連結時用 “ -L dir ”選項指定
怎麼確定“系統目錄”?執行下面命令確定目錄:
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v –
它會列出標頭檔案目錄、庫目錄(LIBRARY_PATH),你編譯出庫檔案時,可以把它放入系統庫目錄。
3。執行問題
執行程式時找不到庫:
error while loading shared libraries: libxxx。so:
cannot open shared object file: No such file or directory
找不到庫,庫在哪?
① 系統目錄:就是板子上的/lib、/usr/lib目錄
② 也可以自己指定:
執行程式用環境變數LD_LIBRARY_PATH指定,執行以下的命令:
export LD_LIBRARY_PATH=/xxx_dir ; 。/test
或
LD_LIBRARY_PATH=/xxx_dir 。/test
6.4.3 交叉編譯程式的萬能命令
如果交叉編輯工具鏈的字首是arm-buildroot-linux-gnueabihf-,比如arm-buildroot-linux-gnueabihf-gcc,交叉編譯開源軟體時,如果它裡面有configure,萬能命令如下:
。/configure ——host=arm-buildroot-linux-gnueabihf ——prefix=$PWD/tmp
make
make install
就可以在當前目錄的tmp目錄下看見bin, lib, include等目錄,裡面存有可執行程式、庫、標頭檔案。
1。把標頭檔案、庫檔案放到工具鏈目錄裡
如果你編譯的是一個庫,請把得到的標頭檔案、庫檔案放入工具鏈的include、lib目錄裡。別的程式要使用這些標頭檔案、庫時,會很方便。
工具鏈裡可能有多個include、lib目錄,放到哪裡去?
執行下面命令來確定目錄:
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v –
它會列出標頭檔案目錄、庫目錄(LIBRARY_PATH)。
2。 把庫檔案放到板子上的/lib或/usr/lib目錄裡
程式在板子上執行時,需要用到板子上/lib或/usr/lib下的庫檔案;程式執行時不需要標頭檔案。
6.4.4 交叉編譯freetype
使用GIT下載所有原始碼後,本節原始碼位於如下目錄:
01_all_series_quickstart
04_嵌入式Linux應用開發基礎知識\source\10_freetype
freetype-2。10。2。tar。xz
libpng-1。6。37。tar。xz
本節文件以STM32MP157開發板,對於其他開發板:工具鏈可能不一樣,請靈活變通。
1。確定標頭檔案、庫檔案在工具鏈中的目錄
以STM32MP157開發板為例,它的工具鏈是arm-buildroot-linux-gnueabihf-gcc,可以執行以下命令:
echo ‘main(){}’| arm-buildroot-linux-gnueabihf-gcc -E -v -
可以確定標頭檔案的系統目錄為:
/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include
庫檔案的系統目錄為:
/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib
```c
2。 交叉編譯、安裝libpng
freetype依賴於libpng,所以需要先編譯、安裝libpng。命令如下:
```c
book@PC$ tar xJf libpng-1。6。37。tar。xz
book@PC$ cd libpng-1。6。37
book@PC$ 。/configure ——host=arm-buildroot-linux-gnueabihf ——prefix=$PWD/tmp
book@PC$ make
book@PC$ make install
book@PC$ cd tmp
book@PC$ cp include/* -rf /home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include
book@PC$ cp lib/* -rfd /home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib
2。交叉編譯、安裝freetype
新增VX13923404017 進入技術交流群