技術收藏之Linux gcc編譯引數

2021-10-24 22:28:03 字數 2609 閱讀 1797

警告(warning)

庫依賴編譯優化

編譯加速

gcc常用選項

傳載自:

第一步是進行預編譯,使用-e引數可以讓gcc在預處理結束後停止編譯過程。比如:

gcc -e hello.c -o hello.i
預處理的巨集定義插入到hello.i中。

第二步是將hello.i編譯為目標**,這可以通過使用-c引數來完成。比如:

gcc -c hello.i -o hello.o
也可以通過原始檔直接生成:gcc -c hello.c

gcc hello.o -o hello
也可以通過原始檔直接生成:gcc -o hello hello.c

1、-pedantic 選項,那麼使用了擴充套件語法的地方將產生相應的警告資訊。

2、-wall 使用它能夠使gcc產生盡可能多的警告資訊。

3、-werror,它要求gcc將所有的警告當成錯誤進行處理。所以如果我們對自己的**提高要求的話,就盡量加上這個引數吧。warning也不要放過。

4、-w,這個和werror剛好相反,它將禁止所有的報警。慎用。

1、linux下的大多數函式都預設:

標頭檔案放到/usr/include/目錄下。

而庫檔案則放到/usr/lib/目錄下。

1、gcc在編譯時可以自定義查詢所需要的標頭檔案和庫檔案。

-i選項可以向gcc的標頭檔案搜尋路徑中新增新的目錄。

例如,如果在/home/xiaowp/include/目錄下有編譯時所需要的標頭檔案,為了讓gcc能夠順利地找到它們,就可以使用-i選項:

gcc -o test test.c -i /home/xiaowp/include
-l選項向gcc的庫檔案搜尋路徑中新增新的目錄

例如,如果在/home/xiaowp/lib/目錄下有鏈結時所需要的庫檔案libfoo.so,為了讓gcc能夠順利地找到它,可以使用下面的命令

gcc -o test test.c -l /home/xiaowp/lib -lfoo
值得好好解釋一下的是-l選項,它指示gcc去連線庫檔案libfoo.so。

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

-static選項,強制使用靜態鏈結庫

gcc -o test test.c -l /home/xiaowp/lib -

static

-lfoo

選項-o可以告訴gcc同時減小**的長度和執行時間,其效果等價於-o1。

在這一級別上能夠進行的優化型別雖然取決於目標處理器,但一般都會包括執行緒跳轉(thread jump)和延遲退棧(deferred stack pops)兩種優化。

選項-o2告訴gcc除了完成所有-o1級別的優化之外,同時還要進行一些額外的調整工作,如處理器指令排程等。

選項-o3則除了完成所有-o2級別的優化之外,還包括迴圈展開和其它一些與處理器特性相關的優化工作。

通常來說,數字越大優化的等級越高,同時也就意味著程式的執行速度越快。

許多linux程式設計師都喜歡使用-o2選項,因為它在優化長度、編譯時間和**大小之間,取得了乙個比較理想的平衡點。

一、程式開發的時候優化等級越高,消耗在編譯上的時間就越長,因此在開發的時候最好不要使用優化選項,只有到軟體發行或開發結束的時候,才考慮對最終生成的**進行優化。

二、資源受限的時候一些優化選項會增加可執行**的體積。如果程式在執行時能夠申請到的記憶體資源非常緊張(如一些實時嵌入式裝置),那就不要對**進行優化,因為由這帶來的負面影響可能會產生非常嚴重的後果。

三、跟蹤除錯的時候在對**進行優化的時候,某些**可能會被刪除或改寫,或者為了取得更佳的效能而進行重組,從而使跟蹤和除錯變得異常困難。

pipe 加速編譯,使用管道代替編譯中臨時檔案。

gcc -pipe foo.c -o foo
如果是makefile的方式,而機器又是多核的,還可以加上-j引數。比如我的機器是8核,那就可以這樣加快編譯速度。

make -j8
c 通知gcc取消鏈結步驟,即編譯原始碼並在最後生成目標檔案;

-dmacro 定義指定的巨集,使它能夠通過原始碼中的#ifdef進行檢驗;

-e 不經過編譯預處理程式的輸出而輸送至標準輸出;

-g3 獲得有關除錯程式的詳細資訊,它不能與-o選項聯合使用;

-idirectory 在包含檔案搜尋路徑的起點處新增指定目錄;

-llibrary 提示鏈結程式在建立最終可執行檔案時包含指定的庫;

-o、-o2、-o3 將優化狀態開啟,該選項不能與-g選項聯合使用;

-s 要求編譯程式生成來自源**的匯程式設計序輸出;

-v 啟動所有警報;

-wall 在發生警報時取消編譯操作,即將警報看作是錯誤;

-werror 在發生警報時取消編譯操作,即把報警當作是錯誤;

-w 禁止所有的報警。

linux gcc編譯引數

gcc 編譯 hello.c hello.i 預處理階段,生成中間檔案 hello.s 彙編階段,生成彙編檔案 hello.o 編譯階段,生成二進位制 檔案 hello 鏈結階段,生成可執行程式 預處理階段,主要是將巨集定義替換,條件編譯 標頭檔案包含,可以cat hello.i檔案檢視 gcc e...

linux gcc編譯選項

1 安全編譯選項 作業系統提供了許多安全機制來嘗試降低或阻止緩衝區溢位攻擊帶來的安全風險,包括dep aslr等。在使用gcc進行編譯時,可以使用gcc的編譯選項來避免堆疊溢位 整數溢位等問題。2 checksec.sh 3 aslr 位址隨機化 aslr address space layout ...

Linux GCC 編譯原始檔

一.常用編譯命令選項 假設源程式檔名為test.c。1.無選項編譯鏈結 用法 gcc test.c 2.選項 o 用法 gcc test.c o test 3.選項 e 用法 gcc e test.c o test.i 作用 將test.c預處理輸出test.i檔案。4.選項 s 用法 gcc s ...