您當前的位置:首頁 > 攝影

嵌入式開發之交叉編譯程式萬能命令_以freetype為例

作者:由 韋東山嵌入式 發表于 攝影時間:2020-08-27

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 進入技術交流群

標簽: buildroot  ARM  Linux  gnueabihf  lib