【Linux 編譯】記錄幾個大坑!

寫博客的目的就是爲了自己以後方便查閱和總結自己的經驗。最近的我有開始弄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++

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章