由于論壇排版效果不理想,而且我也只在我的個(gè)人空間對(duì)文章進(jìn)行后繼更新,所以建議直接到我的空間查看: 《Glibc Binutils GCC 配置選項(xiàng)簡(jiǎn)介》 《GCC編譯優(yōu)化指南》 ------------------------------------------------------------------------------- 版權(quán)聲明 本文作者是一位自由軟件愛(ài)好者,所以本文雖然不是軟件,但是本著 GPL 的精神發(fā)布。任何人都可以自由使用、轉(zhuǎn)載、復(fù)制和再分發(fā),但必須保留作者署名,亦不得對(duì)聲明中的任何條款作任何形式的修改,也不得附加任何其它條件。您可以自由鏈接、下載、傳播此文檔,但前提是必須保證全文完整轉(zhuǎn)載,包括完整的版權(quán)信息和作譯者聲明。 其他作品 本文作者十分愿意與他人共享勞動(dòng)成果,如果你對(duì)我的其他翻譯作品或者技術(shù)文章有興趣,可以在如下位置查看現(xiàn)有作品的列表: 金步國(guó)作品列表 BUG報(bào)告,切磋與探討 由于作者水平有限,因此不能保證作品內(nèi)容準(zhǔn)確無(wú)誤,請(qǐng)?jiān)陂喿x中自行鑒別。如果你發(fā)現(xiàn)了作品中的錯(cuò)誤,請(qǐng)您來(lái)信指出,哪怕是錯(cuò)別字也好,任何提高作品質(zhì)量的建議我都將虛心接納。如果你愿意就作品中的相關(guān)內(nèi)容與我進(jìn)行進(jìn)一步切磋與探討,也歡迎你與我聯(lián)系。聯(lián)系方式:Email: csfrank@citiz.net ; QQ: 70171448 ; MSN: csfrank122@hotmail.com ============================================== 很多弟兄可能都很關(guān)心如何優(yōu)化編譯自己的程序,雖然本人不贊成"骨灰"玩法,卻也不得不承認(rèn)這是掌握gcc的絕佳途徑; 因此獻(xiàn)上此帖,以供各位玩家參考,絕對(duì)原創(chuàng)噢 ![]() ============================ 大多數(shù)程序和庫(kù)在編譯時(shí)默認(rèn)的優(yōu)化級(jí)別是"2"(使用gcc選項(xiàng):"-O2")并且在Intel/AMD平臺(tái)上默認(rèn)按照i386處理器來(lái)編譯。 如果你只想讓編譯出來(lái)的程序運(yùn)行在特定的平臺(tái)上,就需要執(zhí)行更高級(jí)的編譯器優(yōu)化選項(xiàng),以產(chǎn)生只能運(yùn)行于特定平臺(tái)的代碼。 一種方法是修改每個(gè)源碼包中的Makefile文件,在其中尋找CFLAGS和CXXFLAGS變量(C和C++編譯器的編譯選項(xiàng))并修改它的值。 一些源碼包比如binutils, gcc, glibc等等,在每個(gè)子文件夾中都有Makefile文件,這樣修改起來(lái)就太累了! 另一種簡(jiǎn)易做法是設(shè)置CFLAGS和CXXFLAGS環(huán)境變量。大多數(shù)configure腳本會(huì)使用這兩個(gè)環(huán)境變量代替Makefile文件中的值。 但是少數(shù)configure腳本并不這樣做,他們必須需要手動(dòng)編輯才行。 為了設(shè)置CFLAGS和CXXFLAGS環(huán)境變量,你可以在bash中執(zhí)行如下命令(也可以寫(xiě)進(jìn).bashrc以成為默認(rèn)值): export CFLAGS="-O3 -march=<cpu類型>" && CXXFLAGS=$CFLAGS 這是一個(gè)確保能夠在幾乎所有平臺(tái)上都能正常工作的最小設(shè)置。 "-march"選項(xiàng)表示為特定的cpu類型編譯二進(jìn)制代碼(不能在更低級(jí)別的cpu上運(yùn)行), Intel通常是:pentium2, pentium3, pentium3m, pentium4, pentium4m, pentium-m, prescott, nocona 說(shuō)明:pentium3m/pentium4m是筆記本用的移動(dòng)P3/P4;pentium-m是迅馳I/II代筆記本的cpu; prescott是帶SSE3的P4(以滾燙到可以煎雞蛋而聞名);nocona則是最新的帶有EMT64(64位)的P4(同樣可以煎雞蛋) AMD通常是:k6, k6-2, k6-3, athlon, athlon-tbird, athlon-xp, athlon-mp, opteron, athlon64, athlon-fx 用AMD的一般都是DIYer,就不必解釋了吧。 如果編譯時(shí)沒(méi)有抱怨"segmentation fault, core dumped",那么你設(shè)定的"-O"優(yōu)化參數(shù)一般就沒(méi)什么問(wèn)題。 否則請(qǐng)降低優(yōu)化級(jí)別("-O3" -> "-O2" -> "-O1" -> 取消)。 個(gè)人意見(jiàn):服務(wù)器使用"-O2"就可以了,它是最安全的優(yōu)化參數(shù)(集合);桌面可以使用"-O3" ; 不鼓勵(lì)使用過(guò)多的自定義優(yōu)化選項(xiàng),其實(shí)他們之間沒(méi)什么明顯的速度差異(有時(shí)"-O3"反而更慢)。 編譯器對(duì)硬件非常敏感,特別是在使用較高的優(yōu)化級(jí)別的時(shí)候,一丁點(diǎn)的內(nèi)存錯(cuò)誤都可能導(dǎo)致致命的失敗。 所以在編譯時(shí)請(qǐng)千萬(wàn)不要超頻你的電腦(我編譯關(guān)鍵程序時(shí)總是先降頻然的)。 注意:選項(xiàng)的順序很重要,如果有兩個(gè)選項(xiàng)互相沖突,則以后一個(gè)為準(zhǔn)。 比如"-O3"將打開(kāi)-finline-functions選項(xiàng),但是可以用"-O3 -fno-inline-functions"既使用-O3的功能又關(guān)閉函數(shù)內(nèi)嵌功能。 更多的優(yōu)化選項(xiàng)請(qǐng)參見(jiàn): http://gcc./onlinedocs/gcc-3.4.4/gcc/Optimize-Options.html http://gcc./onlinedocs/gcc-3.4.4/gcc/i386-and-x86_002d64-Options.html http://gcc./onlinedocs/gcc-4.0.2/gcc/Optimize-Options.html http://gcc./onlinedocs/gcc-4.0.2/gcc/i386-and-x86_002d64-Options.html 所有GCC選項(xiàng)完整列表參見(jiàn): http://gcc./onlinedocs/gcc-3.4.4/gcc/Option-Summary.html http://gcc./onlinedocs/gcc-4.0.2/gcc/Option-Summary.html 有兩個(gè)頁(yè)面值的參考: (對(duì)于gentoo-1.4)比較安全的優(yōu)化選項(xiàng) http://www./gentoo/gccflags/flag_gcc3.html (對(duì)于gentoo-1.4)進(jìn)階優(yōu)化選項(xiàng) http://www./gentoo/gccflags/flag_gcc3opt.html ******************************************************************* 哦,忘了說(shuō)一聲,"-O2"已經(jīng)啟用絕大多數(shù)安全的優(yōu)化選項(xiàng)了,所以其實(shí)你不必對(duì)那一堆選項(xiàng)發(fā)愁。 先說(shuō)說(shuō)"-O3"在"-O2"基礎(chǔ)上增加的幾項(xiàng),你可以按需添加(還算比較安全): [gcc-3.4.4] -finline-functions 允許編譯器選擇某些簡(jiǎn)單的函數(shù)在其被調(diào)用處展開(kāi) -fweb 為每個(gè)web結(jié)構(gòu)體分配一個(gè)偽寄存器 -frename-registers 試圖驅(qū)除代碼中的假依賴關(guān)系,這個(gè)選項(xiàng)對(duì)具有大量寄存器的機(jī)器很有效。 [gcc-4.0.2] -finline-functions 說(shuō)明如上 -funswitch-loops 將循環(huán)體中不改變值的變量移動(dòng)到循環(huán)體之外 -fgcse-after-reload **不太明白它的含義**[哪位大峽知道給小弟講解一下,先行謝過(guò) ![]() 說(shuō)完"-O3"再說(shuō)說(shuō)在嵌入式系統(tǒng)上常用的"-Os"選項(xiàng),這個(gè)選項(xiàng)其實(shí)也很重要,它的含義是對(duì)生成的二進(jìn)制代碼進(jìn)行尺寸上的優(yōu)化,它打開(kāi)了所有"-O2"打開(kāi)的選項(xiàng),因此通常認(rèn)為的"-Os"生成的二進(jìn)制代碼執(zhí)行效率低的潛在意識(shí)是錯(cuò)誤的!當(dāng)然該選項(xiàng)與"-O2"的不同之處在于它在"-O2"的基礎(chǔ)上禁止了所有為了對(duì)齊而插入的空間,也就是將所有"-falign-*"系列的選項(xiàng)禁用了。這種禁用究竟是否一定降低了代碼的執(zhí)行效率,依據(jù)程序的不同而不同,據(jù)說(shuō)某些情況下"-Os"的效率比"-O3"還要高14%!請(qǐng)兄弟們?cè)趯?shí)踐中自己摸索吧... ![]() --------------------------------------------- 下面選擇我認(rèn)為比較重要的幾項(xiàng)簡(jiǎn)單介紹一下[gcc-3.4.4],GCC選項(xiàng)完整列表太長(zhǎng)了!精力有限。 [注意]這里列出的都是非默認(rèn)的選項(xiàng),你只需要添加你所需要的選項(xiàng)即可 -w 禁止輸出警告消息 -Werror 將所有警告轉(zhuǎn)換為錯(cuò)誤 -Wall 顯示所有的警告消息 -v 顯示編譯程序的當(dāng)前版本號(hào) -V<version> 指定gcc將要運(yùn)行的版本。只有在安裝了多個(gè)版本gcc的機(jī)器上才有效。 -ansi 按照ANSI標(biāo)準(zhǔn)編譯程序,但并不限制與標(biāo)準(zhǔn)并不沖突的GNU擴(kuò)展(一般不用該選項(xiàng)) -pedantic 如果要限制代碼必須嚴(yán)格符合ISO標(biāo)準(zhǔn),就在"-ansi"的基礎(chǔ)上同時(shí)啟用這個(gè)選項(xiàng)(很少使用) -std=<name> 指定C語(yǔ)言的標(biāo)準(zhǔn)(c89,c99,gnu89),該選項(xiàng)禁止了GNU C的擴(kuò)展關(guān)鍵字asm,typeof,inline (一般不用該選項(xiàng)) -static 連接器將忽略動(dòng)態(tài)連接庫(kù),同時(shí)通過(guò)將靜態(tài)目標(biāo)文件直接包含到結(jié)果目標(biāo)文件完成對(duì)所有引用的解析。 -shared 連接器將生成共享目標(biāo)代碼,該共享庫(kù)可在運(yùn)行時(shí)動(dòng)態(tài)連接到程序形成完整的可執(zhí)行體。 如果使用gcc命令創(chuàng)建共享庫(kù)作為其輸出,該選項(xiàng)可以防止連接器將缺失main()方法視為錯(cuò)誤。 為了可以正確的工作,應(yīng)該一致的使用選項(xiàng)"-fpic"以及目標(biāo)平臺(tái)選項(xiàng)編譯構(gòu)成同一個(gè)庫(kù)的所有共享目標(biāo)模塊。 -shared-libgcc 該選項(xiàng)指定使用共享版本的libgcc,在沒(méi)有共享版本的libgcc的機(jī)器上該選項(xiàng)無(wú)效。 -specs=<filename> gcc驅(qū)動(dòng)程序讀取該文件以確定哪些選項(xiàng)應(yīng)該傳遞給那些子進(jìn)程。 該選項(xiàng)可以通過(guò)指定配置文件來(lái)覆蓋默認(rèn)配置,指定的文件將在默認(rèn)配置文件讀取后進(jìn)行處理以修改默認(rèn)配置。 -pipe 使用管道而不是臨時(shí)文件一個(gè)階段到另一個(gè)階段交換輸出的方式,可以加快編譯速度。建議使用。 -o <filename> 指定輸出文件,對(duì)各種輸出皆有效。由于只能指定一個(gè)文件,所以在產(chǎn)生多個(gè)輸出文件的情況下不要使用該選項(xiàng)。 --help 顯示gcc的命令行選項(xiàng)列表;與"-v"一起使用時(shí)還將顯示gcc調(diào)用的各個(gè)進(jìn)程所接受的選項(xiàng)。 --target-help 顯示目標(biāo)機(jī)器相關(guān)的命令行選項(xiàng)列表 -b<machine> 指示需要編譯程序的目標(biāo)機(jī)器;默認(rèn)為編譯程序所運(yùn)行的目標(biāo)機(jī)編譯代碼。 目標(biāo)機(jī)通過(guò)指定包含編譯程序的目錄來(lái)確定,通常為/usr/local/lib/gcc-lib/<machine>/<version> -B<lib-prefix> 指定庫(kù)文件的位置,包括編譯程序的文件、執(zhí)行程序和數(shù)據(jù)文件,如果需要運(yùn)行子程序(如cpp,as,ld)就會(huì)用該前綴來(lái)定位。 這個(gè)前綴可以是用冒號(hào)分割的多個(gè)路徑,環(huán)境變量GCC_EXEC_PREFIX和這個(gè)選項(xiàng)有相同的效果。 -I<dir> 指定搜索系統(tǒng)頭文件的目錄,可以重復(fù)使用多個(gè)該選項(xiàng)指定多個(gè)目錄。 -dumpmachine 顯示該程序的目標(biāo)機(jī)名字,不做其他任何動(dòng)作 -dumpspecs 顯示構(gòu)件編譯程序的規(guī)范信息,包括用來(lái)編譯、匯編和連接gcc編譯程序自身用到的所有選項(xiàng),不做其他任何動(dòng)作。 -dumpversion 顯示編譯程序自身的版本號(hào),不做其他任何動(dòng)作 -falign-functions=N 將所有函數(shù)的起始地址在N(N=1,2,4,8,16...)的邊界上對(duì)齊,默認(rèn)為機(jī)器自身的默認(rèn)值,指定為1表示禁止對(duì)齊。 -falign-jumps=N 將分支目標(biāo)在N(N=1,2,4,8,16...)的邊界上對(duì)齊,默認(rèn)為機(jī)器自身的默認(rèn)值,指定為1表示禁止對(duì)齊。 -fno-align-labels 建議使用它,以保證不和-falign-jumps("-O2"默認(rèn)啟用的選項(xiàng))沖突 -fno-align-loops 建議使用它,以確保不會(huì)在分支目標(biāo)前插入多余的空指令。 -fbranch-probabilities 在使用"-fprofile-arcs"選項(xiàng)編譯程序并執(zhí)行它來(lái)創(chuàng)建包含每個(gè)代碼塊執(zhí)行次數(shù)的文件之后,程序可以利用這一選項(xiàng)再次編譯, 文件中所產(chǎn)生的信息將被用來(lái)優(yōu)化那些經(jīng)常發(fā)生的分支代碼。如果沒(méi)有這些信息,gcc將猜測(cè)那一分支可能經(jīng)常發(fā)生并進(jìn)行優(yōu)化。 這類優(yōu)化信息將會(huì)存放在一個(gè)以源文件為名字的并以".da"為后綴的文件中。 -fno-guess-branch-probability 默認(rèn)情況下gcc將使用隨機(jī)模型進(jìn)行猜測(cè)哪個(gè)分支更可能被經(jīng)常執(zhí)行,并以此來(lái)優(yōu)化代碼,該選項(xiàng)關(guān)閉它。 -fprofile-arcs 在使用這一選項(xiàng)編譯程序并運(yùn)行它以創(chuàng)建包含每個(gè)代碼塊的執(zhí)行次數(shù)的文件后,程序可以再次使用"-fbranch-probabilities"編譯, 文件中的信息可以用來(lái)優(yōu)化那些經(jīng)常選取的分支。如果沒(méi)有這些信息,gcc將猜測(cè)哪個(gè)分支將被經(jīng)常運(yùn)行以進(jìn)行優(yōu)化。 這類優(yōu)化信息將會(huì)存放在一個(gè)以源文件為名字的并以".da"為后綴的文件中。 -fforce-addr 必須將地址復(fù)制到寄存器中才能對(duì)他們進(jìn)行運(yùn)算。由于所需地址通常在前面已經(jīng)加載到寄存器中了,所以這個(gè)選項(xiàng)可以改進(jìn)代碼。 -fforce-mem 必須將數(shù)值復(fù)制到寄存器中才能對(duì)他們進(jìn)行運(yùn)算。由于所需數(shù)值通常在前面已經(jīng)加載到寄存器中了,所以這個(gè)選項(xiàng)可以改進(jìn)代碼。 -ffreestanding 所編譯的程序能夠在獨(dú)立的環(huán)境中運(yùn)行,該環(huán)境可以沒(méi)有標(biāo)準(zhǔn)庫(kù),而且可以不從main()函數(shù)開(kāi)始運(yùn)行。 該選項(xiàng)將設(shè)置"-fno-builtin",且等同于"-fno-hosted"。 -fhosted 所編譯的程序需要運(yùn)行在宿主環(huán)境中,其中需要有完整的標(biāo)準(zhǔn)庫(kù),而且main()函數(shù)具有int型的返回值。 -fno-builtin 除非利用"__builtin_"進(jìn)行引用,否則不識(shí)別所有內(nèi)建函數(shù)。 -fmerge-all-constants 試圖將跨編譯單元的所有常量值和數(shù)組合并在一個(gè)副本中。但是標(biāo)準(zhǔn)C/C++要求每個(gè)變量都必須有不同的存儲(chǔ)位置。 -fmove-all-movables 將所有不變的表達(dá)式移動(dòng)到循環(huán)體之外,這種做法的好壞取決于源代碼中的循環(huán)結(jié)構(gòu)。 -fnon-call-exceptions 產(chǎn)生的代碼可供陷阱指令(如非法浮點(diǎn)運(yùn)算和非法內(nèi)存尋址)拋出異常,需要相關(guān)平臺(tái)的運(yùn)行時(shí)支持,并不普遍有效。 -fomit-frame-pointer 對(duì)于不需要棧指針的函數(shù)就不在寄存器中保存指針,因此可以忽略存儲(chǔ)和檢索地址的代碼,并將寄存器用于普通用途。 所有"-O"級(jí)別都打開(kāi)著一選項(xiàng),但僅在調(diào)試器可以不依靠棧指針運(yùn)行時(shí)才有效。建議不需要調(diào)試的情況下顯式的設(shè)置它。 -fno-optional-diags 禁止輸出診斷消息,C++標(biāo)準(zhǔn)并不需要這些消息。 -fpermissive 將代碼中與標(biāo)準(zhǔn)不符合的診斷消息作為警告而不是錯(cuò)誤輸出。 -fpic 生成可用于共享庫(kù)的位置獨(dú)立代碼(PIC),所有的內(nèi)存尋址均通過(guò)全局偏移表(GOT)完成。該選項(xiàng)并非在所有的機(jī)器上都有效。 要確定一個(gè)地址,需要將代碼自身的內(nèi)存位置作為表中的一項(xiàng)插入。該選項(xiàng)可以產(chǎn)生在共享庫(kù)中存放并從中加載的目標(biāo)模塊。 -fprefetch-loop-arrays 生成數(shù)組預(yù)讀取指令,對(duì)于使用巨大數(shù)組的程序可以加快代碼執(zhí)行速度,適合數(shù)據(jù)庫(kù)相關(guān)的大型軟件等。 -freg-struct-return 生成用寄存器返回短結(jié)構(gòu)的代碼,如果寄存器無(wú)法榮納將使用內(nèi)存。 -fstack-check 為防止程序棧溢出而進(jìn)行必要的檢測(cè),在多線程環(huán)境中運(yùn)行時(shí)才可能需要它。 -ftime-report 編譯完成后顯示編譯耗時(shí)的統(tǒng)計(jì)信息 -funroll-loops 如果在編譯時(shí)可以確定迭代的次數(shù)非常少而且循環(huán)中的指令也非常少,可以使用該選項(xiàng)進(jìn)行循環(huán)展開(kāi),以驅(qū)除循環(huán)和復(fù)制指令。 -finline-limit=<size> 對(duì)偽指令數(shù)超過(guò)<size>的函數(shù),編譯程序?qū)⒉贿M(jìn)行展開(kāi),默認(rèn)為600 --param <name>=<value> gcc內(nèi)部存在一些優(yōu)化代碼程度的限制,調(diào)整這些限制就是調(diào)整整個(gè)優(yōu)化全局。下面列出了參數(shù)的名字和對(duì)應(yīng)的解釋: 名字 解釋 max-delay-slot-insn-search 較大的數(shù)目可以生成更優(yōu)化的代碼,但是會(huì)降低編譯速度,默認(rèn)為100 max-delay-slot-live-search 較大的數(shù)目可以生成更優(yōu)化的代碼,但是會(huì)降低編譯速度,默認(rèn)為333 max-gcse-memory 執(zhí)行GCSE優(yōu)化使用的最大內(nèi)存量,太小將使該優(yōu)化無(wú)法進(jìn)行,默認(rèn)為50M max-gcse-passes 執(zhí)行GCSE優(yōu)化的最大迭代次數(shù),默認(rèn)為1 ******************************************************************* 說(shuō)完了命令行選項(xiàng),下面來(lái)說(shuō)說(shuō)與硬件體系結(jié)構(gòu)(主要是cpu)相關(guān)的設(shè)置[僅針對(duì)i386/x86_64] ![]() 最大名鼎鼎的"-march"上面已經(jīng)說(shuō)過(guò)了,下面講講別的(僅挑些實(shí)用的) -mfpmath=sse P3和athlon-tbird以上級(jí)別的cpu支持 -masm=<dialect> 使用指定的dialect輸出匯編語(yǔ)言指令,可以使用"intel"或"att";默認(rèn)為"att" -mieee-fp 指定編譯器使用IEEE浮點(diǎn)比較,這樣將會(huì)正確的處理比較結(jié)果為無(wú)序的情況。 -malign-double 將double, long double, long long對(duì)齊于雙字節(jié)邊界上;有助于生成更高速的代碼,但是程序的尺寸會(huì)變大。 -m128bit-long-double 指定long double為128位,pentium以上的cpu更喜歡這種標(biāo)準(zhǔn)。 -mregparm=N 指定用于傳遞整數(shù)參數(shù)的寄存器數(shù)目(默認(rèn)不使用寄存器)。0<=N<=3 ;注意:當(dāng)N>0時(shí)你必須使用同一參數(shù)重新構(gòu)建所有的模塊,包括所有的庫(kù)。 -mmmx -mno-mmx -msse -mno-sse -msse2 -mno-sse2 -msse3 -mno-sse3 -m3dnow -mno-3dnow 上面的這些不用解釋了,一看就明白,根據(jù)自己的CPU決定吧 -maccumulate-outgoing-args 指定在函數(shù)引導(dǎo)段中計(jì)算輸出參數(shù)所需最大空間,這在大部分現(xiàn)代cpu中是較快的方法;缺點(diǎn)是會(huì)增加代碼尺寸。 -mthreads 支持Mingw32的線程安全異常處理。對(duì)于依賴于線程安全異常處理的程序,必須啟用這個(gè)選項(xiàng)。 使用這個(gè)選項(xiàng)時(shí)會(huì)定義"-D_MT",它將包含使用選項(xiàng)"-lmingwthrd"連接的一個(gè)特殊的線程輔助庫(kù),用于為每個(gè)線程清理異常處理數(shù)據(jù)。 -minline-all-stringops 嵌入所有的字符串操作??梢蕴岣咦址僮鞯男阅?,但是會(huì)增加代碼尺寸。 -momit-leaf-frame-pointer 不為葉子函數(shù)在寄存器中保存棧指針,這樣可以節(jié)省寄存器,但是將會(huì)是調(diào)試變的困難。參見(jiàn)"-fomit-frame-pointer"。 下面這幾個(gè)僅用于x86_64環(huán)境: -m64 生成專門(mén)運(yùn)行于64位環(huán)境的代碼,不能運(yùn)行于32位環(huán)境 -mcmodel=small [默認(rèn)值]程序和它的符號(hào)必須位于2GB以下的地址空間。指針仍然是64位。程序可以靜態(tài)連接也可以動(dòng)態(tài)連接。 -mcmodel=kernel 內(nèi)核運(yùn)行于2GB地址空間之外。在編譯linux內(nèi)核時(shí)必須使用該選項(xiàng)! -mcmodel=medium 程序必須位于2GB以下的地址空間,但是它的符號(hào)可以位于任何地址空間。程序可以靜態(tài)連接也可以動(dòng)態(tài)連接。 注意:共享庫(kù)不能使用這個(gè)選項(xiàng)編譯! -mcmodel=large 對(duì)地址空間沒(méi)有任何限制,這個(gè)選項(xiàng)的功能目前尚未實(shí)現(xiàn)。 ============================== 既然已經(jīng)講了這么多了索性再講講gcc使用的一些環(huán)境變量 除了大名鼎鼎的CFLAGS和CXXFLAGS以外(其實(shí)是Autoconf的環(huán)境變量),再挑幾個(gè)說(shuō)說(shuō): 所有的PATH類環(huán)境變量(除LD_RUN_PATH外)都是用冒號(hào)分割的目錄列表。 C_INCLUDE_PATH 編譯C程序時(shí)使用的環(huán)境變量,用于查找頭文件。 CPLUS_INCLUDE_PATH 編譯C++程序時(shí)使用的環(huán)境變量,用于查找頭文件。 OBJC_INCLUDE_PATH 編譯Obj-C程序時(shí)使用的環(huán)境變量,用于查找頭文件。 CPATH 編譯C/C++/Obj-C程序時(shí)使用的環(huán)境變量,用于查找頭文件。 COMPILER_PATH 如果沒(méi)有用GCC_EXEC_PREFIX定位子程序,編譯程序?qū)?huì)在此查找它的子程序。 LIBRARY_PATH 連接程序?qū)⒃谶@些目錄中尋找特殊的連接程序文件。 LD_LIBRARY_PATH 該環(huán)境變量不影響編譯程序,但是程序運(yùn)行的時(shí)候會(huì)有影響:程序會(huì)查找該目錄列表以尋找共享庫(kù)。 當(dāng)不能夠在編譯程序的目錄中找到共享庫(kù)的時(shí)候,執(zhí)行程序必須設(shè)置該環(huán)境變量。 LD_RUN_PATH 該環(huán)境變量不影響編譯程序,但是程序運(yùn)行的時(shí)候會(huì)有影響:它在運(yùn)行時(shí)指出了文件的名字,運(yùn)行的程序可以由此得到它的符號(hào)名字和地址。 由于地址不會(huì)重新載入,因而可能符號(hào)應(yīng)用其他文件中的絕對(duì)地址。這個(gè)和ld工具使用的"-R"選項(xiàng)完全一樣。 GCC_EXEC_PREFIX 編譯程序執(zhí)行所有子程序的名字的前綴,默認(rèn)值是"<prefix>/lib/gcc-lib/", 其中的<prefix>是安裝時(shí)configure腳本指定的前綴。 LANG 指定編譯程序使用的字符集,可用于創(chuàng)建寬字符文件、串文字、注釋;默認(rèn)為英文。[目前只支持日文"C-JIS,C-SJIS,C-EUCJP",不支持中文] LC_ALL 指定多字節(jié)字符的字符分類,主要用于確定字符串的字符邊界以及編譯程序使用何種語(yǔ)言發(fā)出診斷消息;默認(rèn)設(shè)置與LANG相同。 中文相關(guān)的幾項(xiàng):"zh_CN.GB2312 , zh_CN.GB18030 , zh_CN.GBK , zh_CN.UTF-8 , zh_TW.BIG5" TMPDIR 編譯程序存放臨時(shí)工作文件的臨時(shí)目錄,這些臨時(shí)文件通常在編譯結(jié)束時(shí)被刪除。 ==================================================================== |
|