轉gcc cflags介紹

shiri512003發表於2010-03-27
http://blog.sina.com.cn/s/blog_51294ca50100fnyc.html[@more@]

本文轉自http://blog.sina.com.cn/s/blog_51294ca50100fnyc.html

版權歸原文作者所有

一,CFLAGS 與 CXXFLAGSCFLAGS 表示用於 C 編譯器的選項,CXXFLAGS 表示用於 C++ 編譯器的選項。這兩個變數實際上涵蓋了編譯和彙編兩個步驟。大多數程式和庫在編譯時預設的最佳化級別是"2"(使用"-O2"選項)並且帶有除錯符號來編譯,也就是 CFLAGS="-O2 -g", CXXFLAGS=$CFLAGS 。事實上,"-O2"已經啟用絕大多數安全的最佳化選項了。另一方面,由於大部分選項可以同時用於這兩個變數,所以僅在最後講述只能用於其中一個變數的選項。[提醒]下面所列選項皆為非預設選項,你只要按需新增即可。
<wbr>
-O3【-O1 ...-O3最佳化級別】

-finline-functions
允許編譯器選擇某些簡單的函式在其被呼叫處展開,比較安全的選項,特別是在CPU二級快取較大時建議使用
<wbr>
-falign-functions=N
-falign-jumps=N
-falign-loops=N
-falign-labels=N
這四個對齊選項在"-O2"中開啟,其中的根據不同的平臺N使用不同的預設值。如果你想指定不同於預設值的N,也可以單獨指定。比如,對於L2-cache>=1M的cpu而言,指定 -falign-functions=64 可能會獲得更好的效能。建議在指定了 -march 的時候不明確指定這裡的值。

全域性選項:

-pipe
在編譯過程的不同階段之間使用管道而非臨時檔案進行通訊,可以加快編譯速度。建議使用。【貌似只有在編譯的時候起作用。
-fstack-check
為防止程式棧溢位而進行必要的檢測,僅在多執行緒環境中執行時才可能需要它。

硬體體系結構相關選項[僅僅針對x86與x86_64]:

-march=cpu-type
為特定的cpu-type編譯二進位制程式碼(不能在更低階別的cpu上執行)。Intel可以用:pentium2, pentium3(=pentium3m), pentium4(=pentium4m), pentium-m, prescott, nocona, core2(GCC-4.3新增) 。AMD可以用:k6-2(=k6-3), athlon(=athlon-tbird), athlon-xp(=athlon-mp), k8(=opteron=athlon64=athlon-fx)
-mfpmath=sse
P3和athlon-xp級別及以上的cpu支援"sse"標量浮點指令。僅建議在P4和K8以上級別的處理器上使用該選項。
-mmmx
-msse
-msse2
-msse3
-m3dnow
-mssse3(GCC-4.3新增)
-msse4.1(GCC-4.3新增)
-msse4.2(GCC-4.3新增)
-msse4(含4.1和4.2,GCC-4.3新增)
是否使用相應的擴充套件指令集以及內建函式,按照自己的cpu選擇吧!【請參照cat /proc/cpuinfo中flags:裡面的資訊】

傳遞給彙編器的選項:

-Wa,-march=CPU
按照特定的CPU進行最佳化:pentiumiii, pentium4, prescott, nocona, core, core2; athlon, sledgehammer, opteron, k8 。【不解,和上邊的-march有什麼區別。】

僅可用於 CXXFLAGS 的選項:

-fvisibility-inlines-hidden
預設隱藏所有行內函數,從而減小匯出符號表的大小,既能縮減檔案的大小,還能提高執行效能,我們強烈建議你在編譯任何共享庫的時候使用該選項。參見 -fvisibility=hidden 選項。
<wbr>

march指定的是當前cpu的架構,而mtune是真正作用於某一型號cpu的選項。

【一個相對安全的策略CFLAGS="-march=native -mtune=native 指令集引數 -pipe -O3"; CXXFLAGS 引數,直接讓他等於 CLAGS 。CXXFLAGS="${CFLAGS}"】

二,LDFLAGS

是傳遞給聯結器的選項。這是一個常被忽視的變數,事實上它對最佳化的影響也是很明顯的。

-s <wbr> <wbr> 刪除可執行程式中的所有符號表和所有重定位資訊。其結果與執行命令 strip 所達到的效果相同,這個選項是比較安全的。
-Wl,--hash-style=gnu
使用gnu風格的符號雜湊表格式。它的動態連結效能比傳統的sysv風格(預設)有較大提升,但是它生成的可執行程式和庫與舊的Glibc以及動態連結器不相容。

<wbr> <wbr> 最後將選定好的編譯引數寫入到某個環境變數的檔案裡。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7591490/viewspace-1032402/,如需轉載,請註明出處,否則將追究法律責任。

相關文章