




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、轉(zhuǎn) GCC編譯器選項及優(yōu)化提示原文地址:版權(quán)聲明本文作者是一位自由軟件愛好者,所以本文雖然不是軟件,但是本著GPL的精神發(fā)布。任何人都可以自由使用、轉(zhuǎn)載、復(fù)制和再分發(fā),但必須保留作者署名,亦不得對聲明中的任何條款作任何形式的修改,也不得附加任何其它條件。您可以自由鏈接、下載、傳播此文檔,但前提是必須保證全文完整轉(zhuǎn)載,包括完整的版權(quán)信息和作譯者聲明。其他作品本文作者十分愿意與他人共享勞動成果,如果你對我的其他翻譯作品或者技術(shù)文章有興趣,可以在如下位置查看現(xiàn)有作品的列表:金步國作品列表BUG報告,切磋與探討由于作者水平有限,因此不能保證作品內(nèi)容準(zhǔn)確無誤,請在閱讀中自行鑒別。如果你發(fā)現(xiàn)了作品中的錯誤
2、,請您來信指出,哪怕是錯別字也好,任何提高作品質(zhì)量的建議我都將虛心接納。如果你愿意就作品中的相關(guān)內(nèi)容與我進(jìn)行進(jìn)一步切磋與探討,也歡迎你與我聯(lián)系。聯(lián)系方式:Email:;QQ:;MSN:=很多弟兄可能都很關(guān)心如何優(yōu)化編譯自己的程序,雖然本人不贊成骨灰玩法,卻也不得不承認(rèn)這是掌握gcc的絕佳途徑;因此獻(xiàn)上此帖,以供各位玩家參考,絕對原創(chuàng)噢=大多數(shù)程序和庫在編譯時默認(rèn)的優(yōu)化級別是2(使用gcc選項:-O2)并且在Intel/AMD平臺上默認(rèn)按照i386處理器來編譯。如果你只想讓編譯出來的程序運行在特定的平臺上,就需要執(zhí)行更高級的編譯器優(yōu)化選項,以產(chǎn)生只能運行于特定平臺的代碼。一種方法是修改每個源碼包
3、中的Makefile文件,在其中尋找CFLAGS和CXXFLAGS變量(C和C+編譯器的編譯選項)并修改它的值。一些源碼包比如binutils,gcc,glibc等等,在每個子文件夾中都有Makefile文件,這樣修改起來就太累了!另一種簡易做法是設(shè)置CFLAGS和CXXFLAGS環(huán)境變量。大多數(shù)configure腳本會使用這兩個環(huán)境變量代替Makefile文件中的值。但是少數(shù)configure腳本并不這樣做,他們必須需要手動編輯才行。為了設(shè)置CFLAGS和CXXFLAGS環(huán)境變量,你可以在bash中執(zhí)行如下命令(也可以寫進(jìn).bashrc以成為默認(rèn)值):export CFLAGS=-O3-ma
4、rch=cpu類型&CXXFLAGS=$CFLAGS這是一個確保能夠在幾乎所有平臺上都能正常工作的最小設(shè)置。-march選項表示為特定的cpu類型編譯二進(jìn)制代碼(不能在更低級別的cpu上運行),Intel通常是:pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium-m,prescott,nocona說明:pentium3m/pentium4m是筆記本用的移動P3/P4;pentium-m是迅馳I/II代筆記本的cpu;prescott是帶SSE3的P4(以滾燙到可以煎雞蛋而聞名);nocona則是最新的帶有EMT64(64位)的P4(同樣
5、可以煎雞蛋)AMD通常是:k6,k6-2,k6-3,athlon,athlon-tbird,athlon-xp,athlon-mp,opteron,athlon64,athlon-fx用AMD的一般都是DIYer,就不必解釋了吧。如果編譯時沒有抱怨segmentation fault,core dumped,那么你設(shè)定的-O優(yōu)化參數(shù)一般就沒什么問題。否則請降低優(yōu)化級別(-O3-O2-O1-取消)。個人意見:服務(wù)器使用-O2就可以了,它是最安全的優(yōu)化參數(shù)(集合);桌面可以使用-O3;不鼓勵使用過多的自定義優(yōu)化選項,其實他們之間沒什么明顯的速度差異(有時-O3反而更慢)。編譯器對硬件非常敏感,特別
6、是在使用較高的優(yōu)化級別的時候,一丁點的內(nèi)存錯誤都可能導(dǎo)致致命的失敗。所以在編譯時請千萬不要超頻你的電腦(我編譯關(guān)鍵程序時總是先降頻然的)。注意:選項的順序很重要,如果有兩個選項互相沖突,則以后一個為準(zhǔn)。比如-O3將打開-finline-functions選項,但是可以用-O3-fno-inline-functions既使用-O3的功能又關(guān)閉函數(shù)內(nèi)嵌功能。更多的優(yōu)化選項請參見:所有GCC選項完整列表參見:有兩個頁面值的參考:(對于gentoo-1.4)比較安全的優(yōu)化選項對于gentoo-1.4)進(jìn)階優(yōu)化選項哦,忘了說一聲,-O2已經(jīng)啟用絕大多數(shù)安全的優(yōu)化選項了,所以其實你不必對那一堆選項發(fā)愁。先
7、說說-O3在-O2基礎(chǔ)上增加的幾項,你可以按需添加(還算比較安全):gcc-3.4.4-finline-functions允許編譯器選擇某些簡單的函數(shù)在其被調(diào)用處展開-fweb為每個web結(jié)構(gòu)體分配一個偽寄存器-frename-registers試圖驅(qū)除代碼中的假依賴關(guān)系,這個選項對具有大量寄存器的機器很有效。gcc-4.0.2-finline-functions說明如上-funswitch-loops將循環(huán)體中不改變值的變量移動到循環(huán)體之外-fgcse-after-reload*不太明白它的含義*哪位大峽知道給小弟講解一下,先行謝過說完-O3再說說在嵌入式系統(tǒng)上常用的-Os選項,這個選項其實
8、也很重要,它的含義是對生成的二進(jìn)制代碼進(jìn)行尺寸上的優(yōu)化,它打開了所有-O2打開的選項,因此通常認(rèn)為的-Os生成的二進(jìn)制代碼執(zhí)行效率低的潛在意識是錯誤的!當(dāng)然該選項與-O2的不同之處在于它在-O2的基礎(chǔ)上禁止了所有為了對齊而插入的空間,也就是將所有-falign-*系列的選項禁用了。這種禁用究竟是否一定降低了代碼的執(zhí)行效率,依據(jù)程序的不同而不同,據(jù)說某些情況下-Os的效率比-O3還要高14%!請兄弟們在實踐中自己摸索吧.-下面選擇我認(rèn)為比較重要的幾項簡單介紹一下gcc-3.4.4,GCC選項完整列表太長了!精力有限。注意這里列出的都是非默認(rèn)的選項,你只需要添加你所需要的選項即可-w禁止輸出警告消
9、息-Werror將所有警告轉(zhuǎn)換為錯誤-Wall顯示所有的警告消息-v顯示編譯程序的當(dāng)前版本號-V version指定gcc將要運行的版本。只有在安裝了多個版本gcc的機器上才有效。-ansi按照ANSI標(biāo)準(zhǔn)編譯程序,但并不限制與標(biāo)準(zhǔn)并不沖突的GNU擴展(一般不用該選項)-pedantic如果要限制代碼必須嚴(yán)格符合ISO標(biāo)準(zhǔn),就在-ansi的基礎(chǔ)上同時啟用這個選項(很少使用)-std=name指定C語言的標(biāo)準(zhǔn)(c89,c99,gnu89),該選項禁止了GNU C的擴展關(guān)鍵字asm,typeof,inline(一般不用該選項)-static連接器將忽略動態(tài)連接庫,同時通過將靜態(tài)目標(biāo)文件直接包含到結(jié)
10、果目標(biāo)文件完成對所有引用的解析。-shared連接器將生成共享目標(biāo)代碼,該共享庫可在運行時動態(tài)連接到程序形成完整的可執(zhí)行體。如果使用gcc命令創(chuàng)建共享庫作為其輸出,該選項可以防止連接器將缺失main()方法視為錯誤。為了可以正確的工作,應(yīng)該一致的使用選項-fpic以及目標(biāo)平臺選項編譯構(gòu)成同一個庫的所有共享目標(biāo)模塊。-shared-libgcc該選項指定使用共享版本的libgcc,在沒有共享版本的libgcc的機器上該選項無效。-specs= gcc驅(qū)動程序讀取該文件以確定哪些選項應(yīng)該傳遞給那些子進(jìn)程。該選項可以通過指定配置文件來覆蓋默認(rèn)配置,指定的文件將在默認(rèn)配置文件讀取后進(jìn)行處理以修改默認(rèn)配
11、置。-pipe使用管道而不是臨時文件一個階段到另一個階段交換輸出的方式,可以加快編譯速度。建議使用。-o 指定輸出文件,對各種輸出皆有效。由于只能指定一個文件,所以在產(chǎn)生多個輸出文件的情況下不要使用該選項。-help顯示gcc的命令行選項列表;與-v一起使用時還將顯示gcc調(diào)用的各個進(jìn)程所接受的選項。-target-help顯示目標(biāo)機器相關(guān)的命令行選項列表-b machine指示需要編譯程序的目標(biāo)機器;默認(rèn)為編譯程序所運行的目標(biāo)機編譯代碼。目標(biāo)機通過指定包含編譯程序的目錄來確定,通常為/usr/local/lib/gcc-lib/machine/version-B lib-prefix指定庫文
12、件的位置,包括編譯程序的文件、執(zhí)行程序和數(shù)據(jù)文件,如果需要運行子程序(如cpp,as,ld)就會用該前綴來定位。這個前綴可以是用冒號分割的多個路徑,環(huán)境變量GCC_EXEC_PREFIX和這個選項有相同的效果。-I dir指定搜索系統(tǒng)頭文件的目錄,可以重復(fù)使用多個該選項指定多個目錄。-dumpmachine顯示該程序的目標(biāo)機名字,不做其他任何動作-dumpspecs顯示構(gòu)件編譯程序的規(guī)范信息,包括用來編譯、匯編和連接gcc編譯程序自身用到的所有選項,不做其他任何動作。-dumpversion顯示編譯程序自身的版本號,不做其他任何動作-falign-functions=N將所有函數(shù)的起始地址在N
13、(N=1,2,4,8,16.)的邊界上對齊,默認(rèn)為機器自身的默認(rèn)值,指定為1表示禁止對齊。-falign-jumps=N將分支目標(biāo)在N(N=1,2,4,8,16.)的邊界上對齊,默認(rèn)為機器自身的默認(rèn)值,指定為1表示禁止對齊。-fno-align-labels建議使用它,以保證不和-falign-jumps(-O2默認(rèn)啟用的選項)沖突-fno-align-loops建議使用它,以確保不會在分支目標(biāo)前插入多余的空指令。-fbranch-probabilities在使用-fpro選項編譯程序并執(zhí)行它來創(chuàng)建包含每個代碼塊執(zhí)行次數(shù)的文件之后,程序可以利用這一選項再次編譯,文件中所產(chǎn)生的信息將被用來優(yōu)化那
14、些經(jīng)常發(fā)生的分支代碼。如果沒有這些信息,gcc將猜測那一分支可能經(jīng)常發(fā)生并進(jìn)行優(yōu)化。這類優(yōu)化信息將會存放在一個以源文件為名字的并以.da為后綴的文件中。-fno-guess-branch-probability默認(rèn)情況下gcc將使用隨機模型進(jìn)行猜測哪個分支更可能被經(jīng)常執(zhí)行,并以此來優(yōu)化代碼,該選項關(guān)閉它。-fpro在使用這一選項編譯程序并運行它以創(chuàng)建包含每個代碼塊的執(zhí)行次數(shù)的文件后,程序可以再次使用-fbranch-probabilities編譯,文件中的信息可以用來優(yōu)化那些經(jīng)常選取的分支。如果沒有這些信息,gcc將猜測哪個分支將被經(jīng)常運行以進(jìn)行優(yōu)化。這類優(yōu)化信息將會存放在一個以源文件為名字的
15、并以.da為后綴的文件中。-fforce-addr必須將地址復(fù)制到寄存器中才能對他們進(jìn)行運算。由于所需地址通常在前面已經(jīng)加載到寄存器中了,所以這個選項可以改進(jìn)代碼。-fforce-mem必須將數(shù)值復(fù)制到寄存器中才能對他們進(jìn)行運算。由于所需數(shù)值通常在前面已經(jīng)加載到寄存器中了,所以這個選項可以改進(jìn)代碼。-ffreestanding所編譯的程序能夠在獨立的環(huán)境中運行,該環(huán)境可以沒有標(biāo)準(zhǔn)庫,而且可以不從main()函數(shù)開始運行。該選項將設(shè)置-fno-builtin,且等同于-fno-hosted。-fhosted所編譯的程序需要運行在宿主環(huán)境中,其中需要有完整的標(biāo)準(zhǔn)庫,而且main()函數(shù)具有int型
16、的返回值。-fno-builtin除非利用_builtin_進(jìn)行引用,否則不識別所有內(nèi)建函數(shù)。-fmerge-all-constants試圖將跨編譯單元的所有常量值和數(shù)組合并在一個副本中。但是標(biāo)準(zhǔn)C/C+要求每個變量都必須有不同的存儲位置。-fmove-all-movables將所有不變的表達(dá)式移動到循環(huán)體之外,這種做法的好壞取決于源代碼中的循環(huán)結(jié)構(gòu)。-fnon-call-exceptions產(chǎn)生的代碼可供陷阱指令(如非法浮點運算和非法內(nèi)存尋址)拋出異常,需要相關(guān)平臺的運行時支持,并不普遍有效。-fomit-frame-pointer對于不需要棧指針的函數(shù)就不在寄存器中保存指針,因此可以忽略存
17、儲和檢索地址的代碼,并將寄存器用于普通用途。所有-O級別都打開著一選項,但僅在調(diào)試器可以不依靠棧指針運行時才有效。建議不需要調(diào)試的情況下顯式的設(shè)置它。-fno-optional-diags禁止輸出診斷消息,C+標(biāo)準(zhǔn)并不需要這些消息。-fpermissive將代碼中與標(biāo)準(zhǔn)不符合的診斷消息作為警告而不是錯誤輸出。-fpic生成可用于共享庫的位置獨立代碼(PIC),所有的內(nèi)存尋址均通過全局偏移表(GOT)完成。該選項并非在所有的機器上都有效。要確定一個地址,需要將代碼自身的內(nèi)存位置作為表中的一項插入。該選項可以產(chǎn)生在共享庫中存放并從中加載的目標(biāo)模塊。-fprefetch-loop-arrays生成數(shù)
18、組預(yù)讀取指令,對于使用巨大數(shù)組的程序可以加快代碼執(zhí)行速度,適合數(shù)據(jù)庫相關(guān)的大型軟件等。-freg-struct-return生成用寄存器返回短結(jié)構(gòu)的代碼,如果寄存器無法榮納將使用內(nèi)存。-fstack-check為防止程序棧溢出而進(jìn)行必要的檢測,在多線程環(huán)境中運行時才可能需要它。-ftime-report編譯完成后顯示編譯耗時的統(tǒng)計信息-funroll-loops如果在編譯時可以確定迭代的次數(shù)非常少而且循環(huán)中的指令也非常少,可以使用該選項進(jìn)行循環(huán)展開,以驅(qū)除循環(huán)和復(fù)制指令。-finline-limit=size對偽指令數(shù)超過size的函數(shù),編譯程序?qū)⒉贿M(jìn)行展開,默認(rèn)為600-param name
19、=value gcc內(nèi)部存在一些優(yōu)化代碼程度的限制,調(diào)整這些限制就是調(diào)整整個優(yōu)化全局。下面列出了參數(shù)的名字和對應(yīng)的解釋:名字解釋max-delay-slot-insn-search較大的數(shù)目可以生成更優(yōu)化的代碼,但是會降低編譯速度,默認(rèn)為100 max-delay-slot-live-search較大的數(shù)目可以生成更優(yōu)化的代碼,但是會降低編譯速度,默認(rèn)為333 max-gcse-memory執(zhí)行GCSE優(yōu)化使用的最大內(nèi)存量,太小將使該優(yōu)化無法進(jìn)行,默認(rèn)為50M max-gcse-passes執(zhí)行GCSE優(yōu)化的最大迭代次數(shù),默認(rèn)為1*說完了命令行選項,下面來說說與硬件體系結(jié)構(gòu)(主要是cpu)相關(guān)
20、的設(shè)置僅針對i386/x86_64最大名鼎鼎的-march上面已經(jīng)說過了,下面講講別的(僅挑些實用的)-mfpmath=sse P3和athlon-tbird以上級別的cpu支持-masm=dialect使用指定的dialect輸出匯編語言指令,可以使用intel或att;默認(rèn)為att-mieee-fp指定編譯器使用IEEE浮點比較,這樣將會正確的處理比較結(jié)果為無序的情況。-malign-double將double,long double,long long對齊于雙字節(jié)邊界上;有助于生成更高速的代碼,但是程序的尺寸會變大。-m128bit-long-double指定long double為12
21、8位,pentium以上的cpu更喜歡這種標(biāo)準(zhǔn)。-mregparm=N指定用于傳遞整數(shù)參數(shù)的寄存器數(shù)目(默認(rèn)不使用寄存器)。0=N=3;注意:當(dāng)N 0時你必須使用同一參數(shù)重新構(gòu)建所有的模塊,包括所有的庫。-mmmx-mno-mmx-msse-mno-sse-msse2-mno-sse2-msse3-mno-sse3-m3dnow-mno-3dnow上面的這些不用解釋了,一看就明白,根據(jù)自己的CPU決定吧-maccumulate-outgoing-args指定在函數(shù)引導(dǎo)段中計算輸出參數(shù)所需最大空間,這在大部分現(xiàn)代cpu中是較快的方法;缺點是會增加代碼尺寸。-mthreads支持Mingw32的線
22、程安全異常處理。對于依賴于線程安全異常處理的程序,必須啟用這個選項。使用這個選項時會定義-D_MT,它將包含使用選項-lmingwthrd連接的一個特殊的線程輔助庫,用于為每個線程清理異常處理數(shù)據(jù)。-minline-all-stringops嵌入所有的字符串操作??梢蕴岣咦址僮鞯男阅?,但是會增加代碼尺寸。-momit-leaf-frame-pointer不為葉子函數(shù)在寄存器中保存棧指針,這樣可以節(jié)省寄存器,但是將會是調(diào)試變的困難。參見-fomit-frame-pointer。下面這幾個僅用于x86_64環(huán)境:-m64生成專門運行于64位環(huán)境的代碼,不能運行于32位環(huán)境-mcmodel=sm
23、all默認(rèn)值程序和它的符號必須位于2GB以下的地址空間。指針仍然是64位。程序可以靜態(tài)連接也可以動態(tài)連接。-mcmodel=kernel內(nèi)核運行于2GB地址空間之外。在編譯linux內(nèi)核時必須使用該選項!-mcmodel=medium程序必須位于2GB以下的地址空間,但是它的符號可以位于任何地址空間。程序可以靜態(tài)連接也可以動態(tài)連接。注意:共享庫不能使用這個選項編譯!-mcmodel=large對地址空間沒有任何限制,這個選項的功能目前尚未實現(xiàn)。=既然已經(jīng)講了這么多了索性再講講gcc使用的一些環(huán)境變量除了大名鼎鼎的CFLAGS和CXXFLAGS以外(其實是Autoconf的環(huán)境變量),再挑幾個說說:所有的PATH類環(huán)境變量(除LD_RUN_PATH外)都是用冒號分割的目錄列表。C_INCLUDE_PATH編譯C程序時使用的環(huán)境變量,用于查找頭文件。CPLUS_INCLUDE_PATH編譯C+程序時使用的環(huán)境變量,用于查找頭文件。OBJC_INCLUDE_P
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 健康管理公司合同范例
- 雙經(jīng)銷合同范本
- 單位裝修工程合同范本
- 銷售藥膏合同范本
- 2025年太陽能發(fā)電機組項目合作計劃書
- 各類合同范本超全
- 合同范本紙制
- 商鋪的出租合同范本
- 承接糧庫工程合同范本
- 廠房設(shè)備合同范例
- 電鍍園區(qū)現(xiàn)場管理
- 七年級歷史下冊 第一單元 綜合測試卷(人教福建版 2025年春)
- 電腦終端安全培訓(xùn)
- 成人重癥患者顱內(nèi)壓增高防控護(hù)理專家共識2024
- 物品消毒知識培訓(xùn)課件
- 2025年安徽淮北市建投控股集團(tuán)招聘筆試參考題庫含答案解析
- 《孤獨的小螃蟹》導(dǎo)讀課件
- 第3課《列夫·托爾斯泰》課件-2024-2025學(xué)年統(tǒng)編版語文七年級下冊
- 少兒足球基礎(chǔ)知識
- 兒童家長非免疫規(guī)劃疫苗猶豫量表的編制及信效度檢驗
- TSDLPA 0001-2024 研究型病房建設(shè)和配置標(biāo)準(zhǔn)
評論
0/150
提交評論