您現在的位置是:首頁 > 娛樂

交叉編譯程式:以 freetype 為例

由 韋東山嵌入式Linux 發表于 娛樂2022-01-12
簡介1. 確定標頭檔案、庫檔案在工具鏈中的目錄以 STM32MP157 開發板為例,它的工具鏈是 arm-buildroot-linux-gnueabihf-gcc,可以執行以下命令:echo ’main(){}‘| arm-buildroot

百問網韋東山怎麼玩

交叉編譯程式:以 freetype 為例

作者:韋東山

本文字數:3408,閱讀時長:5分鐘

使用 buildroot 來給 ARM 板編譯程式、編譯庫會很簡單,以後系統講解 buildroot 時再使用 buildroot。現在我們還是手工交叉編譯 freetype,這種方法在編譯、安裝一些小程式時很有用。

1、程式執行的一些基礎知識

1. 編譯程式時去哪找標頭檔案?

系統目錄:就是交叉編譯工具鏈裡的某個 include 目錄;

也可以自己指定:編譯時用 “ -I dir ”選項指定。

2. 連結時去哪找庫檔案?

系統目錄:就是交叉編譯工具鏈裡的某個 lib 目錄;

也可以自己指定:連結時用 “ -L dir ”選項指定。

3. 執行時去哪找庫檔案?

系統目錄:就是板子上的/lib、/usr/lib 目錄;

也可以自己指定:執行程式用環境變數 LD_LIBRARY_PATH 指定。

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

3、交叉編譯程式的萬能命令

如果交叉編輯工具鏈的字首是 arm-buildroot-linux-gnueabihf-,比如 arm-buildroot-linux

gnueabihf-gcc,交叉編譯開源軟體時,如果它裡面有 configure,萬能命令如下:

。/configure ——host=arm-buildroot-linux-gnueabihf ——prefix=$PWD/tmpmakemake 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 下的庫檔案;程式執行時不需要標頭檔案。

4、交叉編譯 freetype

使用 GIT 下載所有原始碼後,本節原始碼位於如下目錄:

01_all_series_quickstart\04_嵌入式 Linux 應用開發基礎知識\source\10_freetype\freetype-2。10。2。tar。xzlibpng-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

2. 交叉編譯、安裝 libpng

freetype 依賴於 libpng,所以需要先編譯、安裝 libpng。命令如下:

book@PC$ tar xJf libpng-1。6。37。tar。xzbook@PC$ cd libpng-1。6。37book@PC$ 。/configure ——host=arm-buildroot-linux-gnueabihf ——prefix=$PWD/tmpbook@PC$ makebook@PC$ make installbook@PC$ cd tmpbook@PC$ cp include/* -rf /home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/includebook@PC$ cp lib/* -rfd /home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib

3. 交叉編譯、安裝 freetype

命令如下:

book@PC$ tar xJf freetype-2。10。2。tar。xzbook@PC$ cd freetype-2。10。2book@PC$ 。/configure ——host=arm-buildroot-linux-gnueabihf ——prefix=$PWD/tmpbook@PC$ makebook@PC$ make installbook@PC$ cd tmpbook@PC$ cp include/* -rf /home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/includebook@PC$ cp lib/* -rfd /home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib

「新品首發」STM32MP157開發板火爆預售!首批僅300套

推薦文章