在用gcc編譯鏈結的時候,經常出現找不到庫或者標頭檔案的問題可以用-i 指定標頭檔案的路徑,用-l指定庫的路徑,用-l指定具體的庫檔案
例如:cc=arm-linux-
#在鏈結的時候指定庫檔案和路徑
test:test.o
$(cc)gcc test.o -o test -l /usr/local/jpeg -l:libjpeg.so.9
#-l表示jpeg庫的路徑, 小寫的l 表示具體的某個庫
#在編譯的時候新增標頭檔案的路徑
test.o:test.c
$(cc)gcc -i /usr/local/jpeg/inlcude - c test.c -o test.o
值得好好解釋一下的是-l選項,它指示gcc去連線庫檔案libfoo.so。linux下 的庫檔案在命名時有乙個約定,那就是應該以lib三個字母開頭,由於所有的庫檔案都遵循了同樣的規範,因此在用-l選項指定鏈結的庫檔名時可以省去 lib三個字母,也就是說gcc在對-lfoo進行處理時,會自動去鏈結名為libfoo.so的檔案。
linux下的庫檔案分為兩大類分別是動態鏈結庫(通常以.so結尾)和靜態鏈 接庫(通常以.a結尾),兩者的差別僅在程式執行時所需的**是在執行時動態載入的,還是在編譯時靜態載入的。預設情況下,gcc在鏈結時優先使用動態鏈 接庫,只有當動態鏈結庫不存在時才考慮使用靜態鏈結庫,如果需要的話可以在編譯時加上-static選項,強制使用靜態鏈結庫。例如,如果在 /home/xiaowp/lib/目錄下有鏈結時所需要的庫檔案libfoo.so和libfoo.a,為了讓 gcc在鏈結時只用到靜態鏈結庫,可以使用下面的命令:
gcc foo.c -l /home/xiaowp/lib -static -lfoo -o foo
編譯鏈結問題
編譯 1 檢查標頭檔案有相應的函式和變數宣告 2 原始檔語法問題。只與目標檔案相關,即 o window下目標檔案可打包為lib,而linux下是打包為靜態庫 a 或者動態庫 so vs工程下,如果某些 cpp需要編譯成 obj,則必須在介面上新增到工程中的源資料夾中,這樣才能生成目標檔案.obj,...
C mysql編譯鏈結問題
首先在源 裡面包含標頭檔案mysql.h include usr include mysql mysql.h 這樣可以不用在編譯選項中加 i usr include mysql 直接 include mysql.h 然後在編譯選項中加入 i usr include mysql 編譯選項 gcc i ...
預編譯,編譯,鏈結的原理
假設我們有下面這樣的乙個程式,源 如下 main.c include mytool1.h include mytool2.h int main int argc,char argv mytool1.h ifndef mytool 1 h define mytool 1 h void mytool1 ...