您現在的位置是:首頁 > 娛樂
交叉編譯程式:以 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套
推薦文章
- 楚雄州楚姚、楚大(共線段)高速公路透過交工驗收
記者從12月10日召開的楚姚、楚大(共線段)高速公路交工驗收會議上獲悉楚姚、楚大(共線段)高速公路工程經交工驗收委員會驗收後正式透過交工驗收該工程路段起於楚雄開發區大壩村,接在建的玉楚高速公路,途經東瓜鎮、牟定縣江坡鎮及共和鎮、姚安縣前場鎮...
- 不能生蛋,難道就不能吃蛋嗎?
還有人認為人間沒有真理,所以喪心病狂的偽裝聖人,為獲得名利...
- 游泳世錦賽:張雨霏200米蝶泳摘銅 錯過“大滿貫”
新華社布達佩斯6月22日電(記者劉暘、陳浩)22日晚,國際泳聯第19屆世界游泳錦標賽女子200米蝶泳決賽中,中國“蝶後”張雨霏摘得銅牌,與賽前“金牌大滿貫”的目標擦肩而過...