GCC編譯鏈結時選項

2021-09-16 11:55:26 字數 1256 閱讀 4402

2.3  gcc 鏈結庫檔案的使用

在 linux 下開發軟體時,完全不使用第三方函式庫的情況是比較少見的,通常來講都需要借助乙個或多個函式庫的支援才能夠完成相應的功能。從程式設計師的角度看,函式庫實際上就是一些標頭檔案( .h )和庫檔案( .so 或者 .a )的集合。雖然 linux 下的大多數函式都預設將標頭檔案放到/usr/include/目錄下,而庫檔案則放到 /usr/lib/目錄下,但並不是所有的情況都是這樣。正因如此, gcc 在編譯時必須有自己的辦法來查詢所需要的標頭檔案和庫檔案。 gcc 採用搜尋目錄的辦法來查詢所需要的檔案, -i 選項可以向 gcc 的標頭檔案搜尋路徑中新增新的目錄。例如,如果在/home/justin/include/ 目錄下有編譯時所需要的標頭檔案,為了讓 gcc 能夠順利地找到它們,就可以使用 -i 選項:

gcc foo.c -i /home/justin/include -o foo
同樣,如果使用了不在標準位置的庫檔案,那麼可以通過 -l 選項向 gcc 的庫檔案搜尋路徑中新增新的目錄。例如,如果在 /home/xiaowp/lib/ 目錄下有鏈結時所需要的庫檔案 libfoo.so ,為了讓 gcc 能夠順利地找到它,可以使用下面的命令:

gcc foo.c -l /home/justin/lib -lfoo -o foo
值得好好解釋一下的是-l 選項,它指示 gcc 去連線庫檔案 libfoo.so 。 linux 下的庫檔案在命名時有乙個約定,那就是應該以lib 三個字母開頭,由於所有的庫檔案都遵循了同樣的規範,因此在用-l 選項指定鏈結的庫檔名時可以省去lib 三個字母,也就是說gcc 在對-lfoo 進行處理時,會自動去鏈結名為libfoo.so 。

linux 下的庫檔案分為兩大類分別是動態鏈結庫(通常以.so 結尾)和靜態鏈結庫(通常以.a 結尾),兩者的差別僅在程式執行時所需的**是在執行時動態載入的,還是在編譯時靜態載入的 。預設情況下,gcc 在鏈結時優先使用動態鏈結庫,只有當動態鏈結庫不存在時才考慮使用靜態鏈結庫,如果需要的話可以在編譯時加上-static選項,強制使用靜態鏈結庫。例如,如果在home/justin/lib/ 目錄下有鏈結時所需要的庫檔案libfoo.so 和libfoo.a ,為了讓gcc 在鏈結時只用到靜態鏈結庫,可以使用下面的命令:

gcc foo.c -l /home/justin/lib -static -lfoo -o foo
參考:

Gcc編譯時的 w W Wall選項

今天在看乙個makefile時看到了gcc w wall 這句,不明其理,專門檢視了gcc的使用手冊。w的意思是關閉編譯時的警告,也就是編譯後不顯示任何warning,因為有時在編譯之後編譯器會顯示一些例如資料轉換之類的警告,這些警告是我們平時可以忽略的。wall選項意思是編譯後顯示所有警告。w選項...

GCC編譯選項

gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器as 4.連線目標 生成可執行程式 鏈結器ld 引數詳解 c 只啟用預處理,編譯,和彙編,也...

gcc 編譯選項

gcc 編譯選項,自己翻譯的.gcc 編譯選項,自己翻譯的.o 設定輸出檔名 c 只編譯,不連線.e 只做預編譯.pipe 在多個編譯過程之間使用管道.version 顯示版本.static 靜態連線.ansi c 模式下支援所有 iso c90 標準的 c 程式,c 模式下去除對 gnu c 擴充...