GCC編譯器選項及優化提示

2021-06-09 05:23:16 字數 1322 閱讀 2781

《glibc binutils gcc 配置選項簡介》

《gcc編譯優化指南》

本文作者十分願意與他人共享勞動成果,如果你對我的其他翻譯作品或者技術文章有興趣,可以在如下位置檢視現有作品的列表:

金步國作品列表

bug報告,切磋與**

*********************************************=

很多弟兄可能都很關心如何優化編譯自己的程式,雖然本人不贊成"骨灰"玩法,卻也不得不承認這是掌握gcc的絕佳途徑;

因此獻上此帖,以供各位玩家參考,絕對原創噢

============================

大多數程式和庫在編譯時預設的優化級別是"2"(使用gcc選項:"-o2")並且在intel/amd平台上預設按照i386處理器來編譯。

如果你只想讓編譯出來的程式執行在特定的平台上,就需要執行更高階的編譯器優化選項,以產生只能執行於特定平台的**。

一種方法是修改每個原始碼包中的makefile檔案,在其中尋找cflags和cxxflags變數(c和c++編譯器的編譯選項)並修改它的值。

一些原始碼包比如binutils, gcc, glibc等等,在每個子資料夾中都有makefile檔案,這樣修改起來就太累了!

另一種簡易做法是設定cflags和cxxflags環境變數。大多數configure指令碼會使用這兩個環境變數代替makefile檔案中的值。

但是少數configure指令碼並不這樣做,他們必須需要手動編輯才行。

為了設定cflags和cxxflags環境變數,你可以在bash中執行如下命令(也可以寫進.bashrc以成為預設值):

export cflags="-o3 -march= "-o2" -> "-o1" -> 取消)。

個人意見:伺服器使用"-o2"就可以了,它是最安全的優化引數(集合);桌面可以使用"-o3" ;

不鼓勵使用過多的自定義優化選項,其實他們之間沒什麼明顯的速度差異(有時"-o3"反而更慢)。

編譯器對硬體非常敏感,特別是在使用較高的優化級別的時候,一丁點的記憶體錯誤都可能導致致命的失敗。

所以在編譯時請千萬不要超頻你的電腦(我編譯關鍵程式時總是先降頻然的)。

注意:選項的順序很重要,如果有兩個選項互相衝突,則以後乙個為準。

比如"-o3"將開啟-finline-functions選項,但是可以用"-o3 -fno-inline-functions"既使用-o3的功能又關閉函式內嵌功能。

更多的優化選項請參見:

所有gcc選項完整列表參見:

有兩個頁面值的參考:

(對於gentoo-1.4)比較安全的優化選項

(對於gentoo-1.4)高階優化選項

GCC編譯器的 std選項

gcc支援在編譯的時候使用 std選項來選擇編譯語言的標準。程式本身也是在發展的,不斷變化的。以 c 語言為例,發展至今該程式語言已經迭代了諸多個版本,例如 c89 偶爾又稱為 c90 c94 c89 的修訂版 c99 c11。同樣,c 語言也經歷了很多的標準變化,例如c 11,c 14,以及現在最...

gcc 編譯優化選項

o0 這個等級 字母 o 後面跟個零 關閉所有優化選項,也是cflags或cxxflags中沒有設定 o等級時的預設等級。這樣就不會優化 這通常不是我們想要的。o1 這是最基本的優化等級。編譯器會在不花費太多編譯時間的同時試圖生成更快更小的 這些優化是非常基礎的,但一般這些任務肯定能順利完成。o2 ...

GCC編譯器中的 I L l 選項。

在本文中,我們來聊聊gcc中三個常見的引數,也即 i 大寫的i l 大寫的l 和 l 小寫的l 一.先說 i 注意是大寫的i 我們先來看簡單的程式 main.c include include add.h int main add.c int add int x,int y add.h int ad...