怎么確定“系統目錄”?
echo 'main(){}'| arm-linux-gnueabihf-gcc -E -v -
系統頭檔案目錄 以stdio.h為例:
/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include
系統庫目錄LIBRARY_PATH:
/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
Linux編譯程式時找不到頭檔案的解決辦法
Linux編譯程式時如果找不到頭檔案會提示如下錯誤:
error: xxx.h: No such file or directory
#include <xxx.h>
^
解決方法:
下面敘述以Ubuntu系統為例,
- 先查找 xxx.h 所在路徑:
$ sudo find / -name xxx.h
/usr/local/include/xxx/xxx.h
-
庫的來源問題:
假設這個庫檔案是我們自己寫的,那么只要在編譯時用
-I選項指定自定義頭檔案的dir即可,或者規范一些,可以把這個頭檔案放入系統目錄的中,方便后續使用#include <xxx.h>,直接系統目錄下查找,假設這個庫檔案不是我們自己寫的,即對于系統目錄,
#include <xxx.h>我們執行find命令有可能查出不止一個xxx.h,他們的名字相同,但是目錄不同,這樣還是不知道是哪個目錄, -
查尋main()函式所需的系統庫檔案目錄
鑒于只執行find命令后出現了多個xxx.h所在路徑,我們若想快速定位到我們所需的系統庫檔案的目錄,就需要查一下運行main()函式時所依賴的系統庫檔案
執行
echo 'main(){}'| arm-linux-gnueabihf-gcc -E -v -系統會列出頭檔案目錄、庫目錄(LIBRARY_PATH)
-
結合第1和3兩者的列印資訊,即可快速確定系統目錄的路徑
-
然后用-I選項把目錄加上編譯:
$ gcc test.c -o test -I /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include
雙引號是首先在使用include的源檔案所在目錄找,如果未找到,則到在編譯器作業路徑下繼續尋找,“<>”在編譯器作業路徑下查找
https://blog.csdn.net/vegetable_bird_001/article/details/50905244
https://my.oschina.net/2bit/blog/389556
安裝程序
注意:
-
這里make和install如果無權限受限問題盡量不要使用管理員權限進行安裝,即不要加sudo,否則編譯時,輸入make指令后,系統有可能出現
make:arm-linux-gnueabihf-gcc: Command not found這樣的錯誤,可能的原因:在root權限下,環境變數中沒有添加arm-linux-gnueabihf-gcc所在的路徑,
如果您就是需要在root路徑下運行的話可以參考這篇文章https://blog.csdn.net/whocarea/article/details/103365339
-
編譯其他庫的時候要看其他庫的configure的引數是否支持–host,不支持的話需要export CC設定為你的arm工具鏈
-
切記:不要安裝共享檔案夾中共享的檔案
在虛擬機中編譯freetype時不要使用共享檔案夾去共享庫,否則會報錯如下:
ln: failed to create symbolic link ‘libavutil.so’: Operation not supported這個問題主要原因是在使用ln創建軟連接時候失敗了,因為這個檔案系統是NTFS,windows上的,通過虛擬機掛載到linux上,所以并不支持ln操作,
解決方法:
1.安裝VMTools,把freetype和其相關的依賴包拷貝到linux中再編譯,
2.通過FileZilla把freetype和其相關的依賴包通過sftp傳輸到linux系統中,就可以直接編譯了,
首先安裝zlib庫
zlib的官網地址:http://www.zlib.net/
編譯zlib庫時,./configure不允許傳入–host引數;不支持的話需要export CC設定為你的arm工具鏈
這里通過 $ export CC=arm-linux-gnueabihf-gcc(根據自己的交叉編譯工具鏈修改arm-linux-gnueabihf-gcc) 進行配置交叉編譯工具,
cd zlib-1.2.11
export CC=arm-linux-gnueabihf-gcc
./configure --prefix=$PWD/tmp
make
make install
copy編譯好的庫到“系統目錄”
book@100ask:~/mytest/zlib-1.2.11$ cd tmp/include/
book@100ask:~/mytest/zlib-1.2.11/tmp/include$ cp -rf * /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include
book@100ask:~/mytest/zlib-1.2.11/tmp/include$ cd ../lib/
book@100ask:~/mytest/zlib-1.2.11/tmp/lib$ cp -drf * /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
其次安裝libpng庫
安裝好zlib庫后,再進行libpng庫的安裝,
cd libpng-1.6.37
export LDFLAGS="-L/home/book/mytest/zlib-1.2.11"
export CPPFLAGS="-L/home/book/mytest/zlib-1.2.11"
./configure --host=arm-linux-gnueabihf --prefix=$PWD/tmp
make
sudo make install
注意:這里的LDFLAGS和CPPFLAGS要使用剛剛的zlib-1.2.11的絕對路徑,否則libpng報錯:zlib not installed,
copy編譯好的庫到“系統目錄”
book@100ask:~/mytest/libpng-1.6.37$ cd tmp/
book@100ask:~/mytest/libpng-1.6.37/tmp$ ls
bin include lib share
book@100ask:~/mytest/libpng-1.6.37/tmp$ cd include/
book@100ask:~/mytest/libpng-1.6.37/tmp/include$ ls
libpng16 pngconf.h png.h pnglibconf.h
book@100ask:~/mytest/libpng-1.6.37/tmp/include$ cp -rf * /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include
book@100ask:~/mytest/libpng-1.6.37/tmp/include$ cd ../lib/
book@100ask:~/mytest/libpng-1.6.37/tmp/lib$ ls
libpng16.a libpng16.la libpng16.so libpng16.so.16 libpng16.so.16.37.0 libpng.a libpng.la libpng.so pkgconfig
book@100ask:~/mytest/libpng-1.6.37/tmp/lib$ cp -drf * /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
最后安裝freetype庫
cd freetype-2.10.2
./configure --host=arm-linux-gnueabihf --prefix=$PWD/tmp
make
make install
copy編譯好的庫到“系統目錄”
book@100ask:~/mytest/freetype-2.10.2$ cd tmp
book@100ask:~/mytest/freetype-2.10.2/tmp$ ls
include lib share
book@100ask:~/mytest/freetype-2.10.2/tmp$ cd include/
book@100ask:~/mytest/freetype-2.10.2/tmp/include$ cp -rf * /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include
book@100ask:~/mytest/freetype-2.10.2/tmp/include$ cd ../lib/
book@100ask:~/mytest/freetype-2.10.2/tmp/lib$ cp -drf * /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
Makefile配置:
CFLAGS := -Wall -O2 -g
CFLAGS += -I $(shell pwd)/include
LDFLAGS := -lfreetype
export CFLAGS LDFLAGS
此處Makefile中要指定鏈接庫-lfreetype
詳見:https://www.cnblogs.com/taskiller/archive/2012/12/14/2817650.html
CFLAGS 表示用于 C 編譯器的選項,
CXXFLAGS 表示用于 C++ 編譯器的選項,
這兩個變數實際上涵蓋了編譯和匯編兩個步驟,
CFLAGS: 指定頭檔案(.h檔案)的路徑,如:CFLAGS=-I/usr/include -I/path/include,同樣地,安裝一個包時會在安裝路徑下建立一個include目錄,當安裝程序中出現問題時,試著把以前安裝的包的include目錄加入到該變數中來,
LDFLAGS:gcc 等編譯器會用到的一些優化引數,也可以在里面指定庫檔案的位置,用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib,每安裝一個包都幾乎一定的會在安裝目錄里建立一個lib目錄,如果明明安裝了某個包,而安裝另一個包時,它愣是說找不到,可以抒那個包的lib路徑加入的LDFALGS中試一下,
LIBS:告訴聯結器要鏈接哪些庫檔案,如LIBS = -lpthread -liconv
簡單地說,LDFLAGS是告訴聯結器從哪里尋找庫檔案,而LIBS是告訴聯結器要鏈接哪些庫檔案,不過使用時鏈接階段這兩個引數都會加上,所以你即使將這兩個的值互換,也沒有問題,
最后,簡單測驗一下:執行make

參考來源:
特此感謝!
韋東山老師的視頻教程
交叉編譯libpng報錯:configure: error: zlib not installed
Makefile選項CFLAGS,LDFLAGS,LIBS
#include<> 和 #include""的區別
關于C語言include尖括號和雙引號的對話
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/247264.html
標籤:其他
上一篇:關于IDLE‘s subprocess didn‘t make connection.啟動錯誤的解決辦法
下一篇:centos8 Nginx + SSL(Let‘s Encrypt) + docker git(gogs) 配置與使用
