寫博客的目的就是爲了自己以後方便查閱和總結自己的經驗。最近的我有開始弄Linux應用程序(gui編程,pc端弄完弄到Linux平臺去編譯)。許久沒有弄,碰到了好幾個編譯的大坑。
一、交叉工具鏈的不同的問題
1、交叉編譯就是:在一種平臺上編譯,編譯出來的程序,是放到別的平臺上運行,即編譯的環境和運行的環境不一樣,屬於交叉編譯,主要和嵌入式開發有關。
2、常用工具鏈有以下幾種
arm-linux-gcc arm-linux-addr2line arm-linux-objcopy arm-linux-readelf arm-linux-ar arm-linux-ld arm-linux-objdump arm-linux-size arm-linux-nm arm-linux-strip arm-linux-cc arm-linux-gprof arm-linux-c++filt arm-linux-as arm-linux-cpp arm-linux-gccbug arm-linux-ldd arm-linux-populate arm-linux-strings arm-linux-c++ arm-linux-g++ arm-linux-gcov arm-linux-ranlib |
二、動態庫和靜態庫的區別(自我體會,不是很詳細全面)
1、名稱區別
動態庫:libxxx.so
靜態庫:libxxx.a
2、編譯調用區別
靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。
動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。
3、相同點
都是通過.o生成的
三、集成動態庫時,運行後報錯:沒有找到庫文件xxx.o
xxx.o是個過程文件,運行時卻去尋找這個文件,這種錯誤是未知問題。
嘗試1:修改xxx.c的文件名爲nnn.c,編譯,運行還是報錯。但是名字改成了我修改的nnn.o
基本確定是Makefile的問題。
最後發現 我編譯.o時用的命令是:gcc -o $@ $< $(CFLAGS)
修改成:gcc -c -Wall -o $@ $< $(CFLAGS)即可。
-c:只激活預處理,編譯,和彙編,也就是他只把程序做成obj文件。
換句話說:-c 編譯和彙編,但不要鏈接。
四、.c文件和.cpp文件對應的編譯工具鏈
.c文件:gcc
.cpp文件:g++