CFLAGS RPM_OPT_FLAGS make %{?_smp_mflags} CC="%{__cc}" CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOU 原文:http://jesserei.blog.163.com/blog/static/1214116892010314113510514/ 我安裝的路徑不是/usr,,所以遇到了一些問題。下面就講一下解決辦法,。 PATH="$PATH:/path/to/your/bin:/another/path/to/bin" export PATH 然后,重新啟動shell即可,。 評論這張 轉(zhuǎn)發(fā)至微博 0人 | 分享到: 閱讀(84)| 評論(0)| 引用 (0) |舉報 makefile的 LDFLAGS 選項(xiàng)和LIBS 1,、LDFLAGS是選項(xiàng),LIBS是要鏈接的庫 都是喂給ld的,,只不過一個是告訴ld怎么吃,,一個是吃什么 If you want to pass flags to the linker, both in the configure step and the build step, you can do this in two ways. Either set LDFLAGS or LIBS. The difference between the two is that LIBS will be appended附加 to the command line, while LDFLAGS come earlier. LDFLAGS is pre-loaded with rpath settings for ELF machines depending on the setting of USE_IMAKE or the inclusion of mk/x11.buildlink3.mk. As with CFLAGS, if you do not wish to override these settings, use the += operator: LDFLAGS+= -your -linkerflags 3、makefile “$(CXX) –c $(CPPFLAGS) $(CFLAGS)這里的-c選擇的作用是: 編譯和匯編,,但不鏈接//Compile and assemble, but do not link 4,、關(guān)于makefile中鏈接庫LIB的使用 只是在鏈接生成可執(zhí)行文件時用到,編譯生成目標(biāo)文件時并不需要用到,。 比如socket編程,,在編譯鏈接時需要加上-lsocket.但生成目標(biāo)文件時并不需要,。 下面是一個Makefile的示例。 # +---------------------------------------------+ [金步國]深入理解軟件包的配置,、編譯與安裝 收藏 其他作品 ·金步國作品列表
前言 概述 根據(jù)源碼包中 Makefile.in 文件的指示,configure 腳本檢查當(dāng)前的系統(tǒng)環(huán)境和配置選項(xiàng),在當(dāng)前目錄中生成 Makefile 文件(還有其它本文無需關(guān)心的文件),,然后 make 程序就按照當(dāng)前目錄中的 Makefile 文件的指示將源代碼編譯為二進(jìn)制文件,,最后將這些二進(jìn)制文件移動(即安裝)到指定的地方(仍然按照 Makefile 文件的指示)。 由此可見 Makefile 文件是幕后的核心,。要深入理解安裝過程,,必須首先對 Makefile 文件有充分的了解。本文將首先講述 Makefile 與 make ,,然后再講述 configure 腳本,。并且在講述這兩部分內(nèi)容時,提供了盡可能詳細(xì)的,、可以運(yùn)用于實(shí)踐的參考資料,。 Makefile 與 make make 語法 make [options] [targets] [VAR=VALUE]... [options]是命令行選項(xiàng),,可以用 make --help 命令查看全部,[VAR=VALUE]是在命令行上指定環(huán)境變量,,這兩個大家都很熟悉,,將在稍后詳細(xì)講解。而[targets]是什么呢,?字面的意思是" 目標(biāo)",,也就是希望本次 make 命令所完成的任務(wù)。憑經(jīng)驗(yàn)猜測,,這個[targets]大概可以用"ckeck","install"之類(也就是常見的測試和安裝命令),。但是它到底是 個啥玩意兒?不帶任何"目標(biāo)"的 make 命令是什么意思,?為什么在安裝 LFS 工具鏈中的 Perl-5.8.8 軟件包時會出現(xiàn)"make perl utilities"這樣怪異的命令?要回答這些問題必須首先理解 Makefile 文件中的"規(guī)則",。 Makefile 規(guī)則 一個簡單的 Makefile 規(guī)則是這樣寫的: TARGET : PREREQUISITES COMMAND TARGET 當(dāng)你查看一個實(shí)際的 Makefile 文件時,,你會發(fā)現(xiàn)有些規(guī)則非常復(fù)雜,但是它都符合規(guī)則的基本格式,。此外,,Makefile 文件中通常還包含了除規(guī)則以外的其它很多東西,不過本文只關(guān)心其中的變量,。 Makefile 變量 雖然在 Makefile 中可以直接使用系統(tǒng)的環(huán)境變量,但是也可以通過在 Makefile 中定義同名變量來"遮蓋"系統(tǒng)的環(huán)境變量,。另一方面,,我們可以在調(diào)用 make 時使用 -e 參數(shù)強(qiáng)制使系統(tǒng)中的環(huán)境變量覆蓋 Makefile 中的同名變量,除此之外,,在調(diào)用 make 的命令行上使用 VAR=VALUE 格式指定的環(huán)境變量也可以覆蓋 Makefile 中的同名變量,。(setenv,然后Makefile中使用變量) Makefile 實(shí)例 CC=gcc all : prog1 prog2 install : prog1 prog2 then mkdir -p $(PREFIX)/bin ; fi 從中可以看出,,make 與 make all 以及 make prog1 prog2 三條命令其實(shí)是等價的。而常用的 make check 和 make install 也找到了歸屬。同時我們也看到了 Makefile 中的各種變量是如何影響編譯的,。針對這個特定的 Makefile ,,你甚至可以省略安裝三步曲中的 make 命令而直接使用 make install 進(jìn)行安裝。 同樣,,為了使用自定義的編譯參數(shù)編譯 prog2 ,,我們可以使用 make prog2 CFLAGS="-O3 -march=athlon64" 或 CFLAGS="-O3 -march=athlon64" && make -e prog2 命令達(dá)到此目的。 Makefile 慣例 all 這些約定俗成的變量分為三類,。第一類代表可執(zhí)行程序的名字,例如 CC 代表編譯器這個可執(zhí)行程序,;第二類代表程序使用的參數(shù)(多個參數(shù)使用空格分開),,例如 CFLAGS 代表編譯器執(zhí)行時使用的參數(shù)(一種怪異的做法是直接在 CC 中包含參數(shù));第三類代表安裝目錄,,例如 prefix 等等,,含義簡單,,下面只列出它們的默認(rèn)值,。 AR 函數(shù)庫打包程序,,可創(chuàng)建靜態(tài)庫.a文檔,。默認(rèn)是"ar"。 ARFLAGS 函數(shù)庫打包程序的命令行參數(shù),。默認(rèn)值是"rv"。 prefix前綴 /usr/local bindir $(exec_prefix)/bin sbindir $(exec_prefix)/sbin libexecdir $(exec_prefix)/libexec datadir $(prefix)/share sysconfdir $(prefix)/etc sharedstatedir $(prefix)/com localstatedir $(prefix)/var libdir $(exec_prefix)/lib infodir $(prefix)/info includedir $(prefix)/include oldincludedir $(prefix)/include mandir $(prefix)/man srcdir 需要編譯的源文件所在的目錄,,無默認(rèn)值 最后說說 make 的命令行選項(xiàng)(以Make-3.81版本為準(zhǔn)): -B, --always-make configure 腳本能夠?qū)?Makefile 中的哪些內(nèi)容產(chǎn)生影響呢,?基本上可以這么說:所有內(nèi)容,包括本文最關(guān)心的 Makefile 規(guī)則與 Makefile 變量,。那么又是哪些因素影響著最終生成的 Makefile 文件呢,?答曰:系統(tǒng)環(huán)境和配置選項(xiàng)。 配置選項(xiàng)的影響是顯而易見的,。但是"系統(tǒng)環(huán)境"的概念卻很寬泛,,包含很多方面內(nèi)容,不過我們這里只關(guān)心環(huán)境變量,,具體說來就是將來會在 Makefile 中使用到的環(huán)境變量以及與 Makefile 中的變量同名的環(huán)境變量,。 通用 configure 語法 configure [OPTIONS] [VAR=VALUE]... configure [OPTIONS] [HOST] 不管是哪種語法,,我們都可以用 configure --help 查看所有可用的[OPTIONS],并且通常在結(jié)尾部分還能看到這個腳本所關(guān)心的環(huán)境變量有哪些,。在本文中將對這兩種語法進(jìn)行合并,,使用下面這種簡化的語法: configure [OPTIONS] 這種語法能夠被所有的 configure 腳本所識別,同時也能通過設(shè)置環(huán)境變量和使用特定的[OPTIONS]完成上述兩種語法的一切功能,。 通用 configure 選項(xiàng) 腳本自身選項(xiàng) --host=HOST CPP
看完上述內(nèi)容以后,不用多說你應(yīng)當(dāng)自然而然的明白該進(jìn)行如何對自己的軟件包進(jìn)行定制安裝了,。祝你好運(yùn),!
編譯選項(xiàng) CC 與 CXX CPPFLAGS CFLAGS 與 CXXFLAGS LDFLAGS編譯選項(xiàng)讓我們先看看 Makefile 規(guī)則中的編譯命令通常是怎么寫的。 大多數(shù)軟件包遵守如下約定俗成的規(guī)范: #1,首先從源代碼生成目標(biāo)文件(預(yù)處理,編譯,匯編),,"-c"選項(xiàng)表示不執(zhí)行鏈接步驟,。 $(CC) $(CPPFLAGS) $(CFLAGS) example.c -c -o example.o #2,然后將目標(biāo)文件連接為最終的結(jié)果(連接),"-o"選項(xiàng)用于指定輸出文件的名字,。 $(CC) $(LDFLAGS) example.o -o example #有一些軟件包一次完成四個步驟: $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) example.c -o example 當(dāng)然也有少數(shù)軟件包不遵守這些約定俗成的規(guī)范,,比如: #1,有些在命令行中漏掉應(yīng)有的Makefile變量(注意:有些遺漏是故意的) $(CC) $(CFLAGS) example.c -c -o example.o $(CC) $(CPPFLAGS) example.c -c -o example.o $(CC) example.o -o example $(CC) example.c -o example #2,有些在命令行中增加了不必要的Makefile變量 $(CC) $(CFLAGS) $(LDFLAGS) example.o -o example $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) example.c -c -o example.o 當(dāng)然還有極個別軟件包完全是"胡來":亂用變量(增加不必要的又漏掉了應(yīng)有的)者有之,不用$(CC)者有之,,不一而足..... 盡管將源代碼編譯為二進(jìn)制文件的四個步驟由不同的程序(cpp,gcc/g++,as,ld)完成,,但是事實(shí)上 cpp, as, ld 都是由 gcc/g++ 進(jìn)行間接調(diào)用的。換句話說,,控制了 gcc/g++ 就等于控制了所有四個步驟,。從 Makefile 規(guī)則中的編譯命令可以看出,編譯工具的行為全靠 CC/CXX CPPFLAGS CFLAGS/CXXFLAGS LDFLAGS 這幾個變量在控制,。當(dāng)然理論上控制編譯工具行為的還應(yīng)當(dāng)有 AS ASFLAGS ARFLAGS 等變量,,但是實(shí)踐中基本上沒有軟件包使用它們。 那么我們?nèi)绾慰刂七@些變量呢,?一種簡易的做法是首先設(shè)置與這些 Makefile 變量同名的環(huán)境變量并將它們 export 為全局,,然后運(yùn)行 configure 腳本,大多數(shù) configure 腳本會使用這同名的環(huán)境變量代替 Makefile 中的值,。但是少數(shù) configure 腳本并不這樣做(比如GCC-3.4.6和Binutils-2.16.1的腳本就不傳遞LDFLAGS),,你必須手動編輯生成的 Makefile 文件,在其中尋找這些變量并修改它們的值,,許多源碼包在每個子文件夾中都有 Makefile 文件,,真是一件很累人的事! CC 與 CXX這是 C 與 C++ 編譯器命令,。默認(rèn)值一般是 "gcc" 與 "g++",。這個變量本來與優(yōu)化沒有關(guān)系,但是有些人因?yàn)閾?dān)心軟件包不遵守那些約定俗成的規(guī)范,,害怕自己苦心設(shè)置的 CFLAGS/CXXFLAGS/LDFLAGS 之類的變量被忽略了,,而索性將原本應(yīng)當(dāng)放置在其它變量中的選項(xiàng)一股老兒塞到 CC 或 CXX 中,比如:CC="gcc -march=k8 -O2 -s",。這是一種怪異的用法,,本文不提倡這種做法,而是提倡按照變量本來的含義使用變量,。 CPPFLAGS這是用于預(yù)處理階段的選項(xiàng),。不過能夠用于此變量的選項(xiàng),看不出有哪個與優(yōu)化相關(guān)。如果你實(shí)在想設(shè)一個,,那就使用下面這兩個吧: -DNDEBUG "NDEBUG"是一個標(biāo)準(zhǔn)的 ANSI 宏,,表示不進(jìn)行調(diào)試編譯。 -D_FILE_OFFSET_BITS=64 大多數(shù)包使用這個來提供大文件(>2G)支持,。 CFLAGS 與 CXXFLAGSCFLAGS 表示用于 C 編譯器的選項(xiàng),,CXXFLAGS 表示用于 C++ 編譯器的選項(xiàng)。這兩個變量實(shí)際上涵蓋了編譯和匯編兩個步驟,。大多數(shù)程序和庫在編譯時默認(rèn)的優(yōu)化級別是"2"(使用"-O2"選項(xiàng))并且?guī)в姓{(diào)試符號來編譯,,也就是 CFLAGS="-O2 -g", CXXFLAGS=$CFLAGS 。事實(shí)上,,"-O2"已經(jīng)啟用絕大多數(shù)安全的優(yōu)化選項(xiàng)了,。另一方面,由于大部分選項(xiàng)可以同時用于這兩個變量,,所以僅在最后講述只能用于其中一個變量的選項(xiàng)。[提醒]下面所列選項(xiàng)皆為非默認(rèn)選項(xiàng),,你只要按需添加即可,。 先說說"-O3"在"-O2"基礎(chǔ)上增加的幾項(xiàng): -finline-functions 允許編譯器選擇某些簡單的函數(shù)在其被調(diào)用處展開,比較安全的選項(xiàng),,特別是在CPU二級緩存較大時建議使用,。 -funswitch-loops 將循環(huán)體中不改變值的變量移動到循環(huán)體之外。 -fgcse-after-reload 為了清除多余的溢出,,在重載之后執(zhí)行一個額外的載入消除步驟,。 另外: -fomit-frame-pointer 對于不需要棧指針的函數(shù)就不在寄存器中保存指針,因此可以忽略存儲和檢索地址的代碼,,同時對許多函數(shù)提供一個額外的寄存器,。所有"-O"級別都打開它,但僅在調(diào)試器可以不依靠棧指針運(yùn)行時才有效,。在AMD64平臺上此選項(xiàng)默認(rèn)打開,,但是在x86平臺上則默認(rèn)關(guān)閉。建議顯式的設(shè)置它,。 -falign-functions=N 這四個對齊選項(xiàng)在"-O2"中打開,,其中的根據(jù)不同的平臺N使用不同的默認(rèn)值。如果你想指定不同于默認(rèn)值的N,,也可以單獨(dú)指定,。比如,對于L2-cache>=1M的cpu而言,,指定 -falign-functions=64 可能會獲得更好的性能,。建議在指定了 -march 的時候不明確指定這里的值。 調(diào)試選項(xiàng): -fprofile-arcs 在使用這一選項(xiàng)編譯程序并運(yùn)行它以創(chuàng)建包含每個代碼塊的執(zhí)行次數(shù)的文件后,程序可以再次使用 -fbranch-probabilities 編譯,,文件中的信息可以用來優(yōu)化那些經(jīng)常選取的分支,。如果沒有這些信息,gcc將猜測哪個分支將被經(jīng)常運(yùn)行以進(jìn)行優(yōu)化,。這類優(yōu)化信息將會存放在一個以源文件為名字的并以".da"為后綴的文件中,。 全局選項(xiàng): -pipe 在編譯過程的不同階段之間使用管道而非臨時文件進(jìn)行通信,可以加快編譯速度,。建議使用,。 目錄選項(xiàng): --sysroot=dir 將dir作為邏輯根目錄。比如編譯器通常會在 /usr/include 和 /usr/lib 中搜索頭文件和庫,,使用這個選項(xiàng)后將在 dir/usr/include 和 dir/usr/lib 目錄中搜索,。如果使用這個選項(xiàng)的同時又使用了 -isysroot 選項(xiàng),則此選項(xiàng)僅作用于庫文件的搜索路徑,,而 -isysroot 選項(xiàng)將作用于頭文件的搜索路徑,。這個選項(xiàng)與優(yōu)化無關(guān),但是在 CLFS 中有著神奇的作用,。 代碼生成選項(xiàng): -fno-bounds-check 關(guān)閉所有對數(shù)組訪問的邊界檢查,。該選項(xiàng)將提高數(shù)組索引的性能,但當(dāng)超出數(shù)組邊界時,,可能會造成不可接受的行為,。 -freg-struct-return 如果struct和union足夠小就通過寄存器返回,這將提高較小結(jié)構(gòu)的效率,。如果不夠小,,無法容納在一個寄存器中,將使用內(nèi)存返回,。建議僅在完全使用GCC編譯的系統(tǒng)上才使用,。 -fpic 生成可用于共享庫的位置獨(dú)立代碼。所有的內(nèi)部尋址均通過全局偏移表完成,。要確定一個地址,,需要將代碼自身的內(nèi)存位置作為表中一項(xiàng)插入。該選項(xiàng)產(chǎn)生可以在共享庫中存放并從中加載的目標(biāo)模塊,。 -fstack-check 為防止程序棧溢出而進(jìn)行必要的檢測,,僅在多線程環(huán)境中運(yùn)行時才可能需要它。 -fvisibility=hidden 設(shè)置默認(rèn)的ELF鏡像中符號的可見性為隱藏,。使用這個特性可以非常充分的提高連接和加載共享庫的性能,,生成更加優(yōu)化的代碼,提供近乎完美的API輸出和防止符號碰撞,。我們強(qiáng)烈建議你在編譯任何共享庫的時候使用該選項(xiàng),。參見 -fvisibility-inlines-hidden 選項(xiàng),。 硬件體系結(jié)構(gòu)相關(guān)選項(xiàng)[僅僅針對x86與x86_64]: -march=cpu-type 為特定的cpu-type編譯二進(jìn)制代碼(不能在更低級別的cpu上運(yùn)行)。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"標(biāo)量浮點(diǎn)指令,。僅建議在P4和K8以上級別的處理器上使用該選項(xiàng)。 -malign-double 將double, long double, long long對齊于雙字節(jié)邊界上,;有助于生成更高速的代碼,,但是程序的尺寸會變大,并且不能與未使用該選項(xiàng)編譯的程序一起工作,。 -m128bit-long-double 指定long double為128位,,pentium以上的cpu更喜歡這種標(biāo)準(zhǔn),并且符合x86-64的ABI標(biāo)準(zhǔn),,但是卻不附合i386的ABI標(biāo)準(zhǔn),。 -mregparm=N 指定用于傳遞整數(shù)參數(shù)的寄存器數(shù)目(默認(rèn)不使用寄存器)。0<=N<=3 ,;注意:當(dāng)N>0時你必須使用同一參數(shù)重新構(gòu)建所有的模塊,,包括所有的庫。 -msseregparm 使用SSE寄存器傳遞float和double參數(shù)和返回值,。注意:當(dāng)你使用了這個選項(xiàng)以后,,你必須使用同一參數(shù)重新構(gòu)建所有的模塊,包括所有的庫,。 -mmmx 是否使用相應(yīng)的擴(kuò)展指令集以及內(nèi)置函數(shù),按照自己的cpu選擇吧,! -maccumulate-outgoing-args 指定在函數(shù)引導(dǎo)段中計(jì)算輸出參數(shù)所需最大空間,,這在大部分現(xiàn)代cpu中是較快的方法;缺點(diǎn)是會明顯增加二進(jìn)制文件尺寸,。 -mthreads 支持Mingw32的線程安全異常處理,。對于依賴于線程安全異常處理的程序,必須啟用這個選項(xiàng),。使用這個選項(xiàng)時會定義"-D_MT",,它將包含使用選項(xiàng)"-lmingwthrd"連接的一個特殊的線程輔助庫,用于為每個線程清理異常處理數(shù)據(jù),。 -minline-all-stringops 默認(rèn)時GCC只將確定目的地會被對齊在至少4字節(jié)邊界的字符串操作內(nèi)聯(lián)進(jìn)程序代碼,。該選項(xiàng)啟用更多的內(nèi)聯(lián)并且增加二進(jìn)制文件的體積,但是可以提升依賴于高速 memcpy, strlen, memset 操作的程序的性能,。 -minline-stringops-dynamically GCC-4.3新增,。對未知尺寸字符串的小塊操作使用內(nèi)聯(lián)代碼,而對大塊操作仍然調(diào)用庫函數(shù),,這是比"-minline-all-stringops"更聰明的策略,。決定策略的算法可以通過"-mstringop-strategy"控制。 -momit-leaf-frame-pointer 不為葉子函數(shù)在寄存器中保存棧指針,這樣可以節(jié)省寄存器,,但是將會使調(diào)試變的困難,。注意:不要與 -fomit-frame-pointer 同時使用,因?yàn)闀斐纱a效率低下,。 -m64 生成專門運(yùn)行于64位環(huán)境的代碼,,不能運(yùn)行于32位環(huán)境,僅用于x86_64[含EMT64]環(huán)境,。 -mcmodel=small [默認(rèn)值]程序和它的符號必須位于2GB以下的地址空間,。指針仍然是64位。程序可以靜態(tài)連接也可以動態(tài)連接,。僅用于x86_64[含EMT64]環(huán)境,。 -mcmodel=kernel 內(nèi)核運(yùn)行于2GB地址空間之外。在編譯linux內(nèi)核時必須使用該選項(xiàng),!僅用于x86_64[含EMT64]環(huán)境,。 -mcmodel=medium 程序必須位于2GB以下的地址空間,但是它的符號可以位于任何地址空間,。程序可以靜態(tài)連接也可以動態(tài)連接,。注意:共享庫不能使用這個選項(xiàng)編譯!僅用于x86_64[含EMT64]環(huán)境,。 其它優(yōu)化選項(xiàng): -fforce-addr 必須將地址復(fù)制到寄存器中才能對他們進(jìn)行運(yùn)算,。由于所需地址通常在前面已經(jīng)加載到寄存器中了,所以這個選項(xiàng)可以改進(jìn)代碼,。 -finline-limit=n 對偽指令數(shù)超過n的函數(shù),,編譯程序?qū)⒉贿M(jìn)行內(nèi)聯(lián)展開,默認(rèn)為600,。增大此值將增加編譯時間和編譯內(nèi)存用量并且生成的二進(jìn)制文件體積也會變大,,此值不宜太大。 -fmerge-all-constants 試圖將跨編譯單元的所有常量值和數(shù)組合并在一個副本中,。但是標(biāo)準(zhǔn)C/C++要求每個變量都必須有不同的存儲位置,,所以該選項(xiàng)可能會導(dǎo)致某些不兼容的行為。 -fgcse-sm 在全局公共子表達(dá)式消除之后運(yùn)行存儲移動,,以試圖將存儲移出循環(huán),。gcc-3.4中曾屬于"-O2"級別的選項(xiàng)。 -fgcse-las 在全局公共子表達(dá)式消除之后消除多余的在存儲到同一存儲區(qū)域之后的加載操作,。gcc-3.4中曾屬于"-O2"級別的選項(xiàng),。 -floop-optimize 已廢除(GCC-4.1曾包含在"-O1"中)。 -floop-optimize2 使用改進(jìn)版本的循環(huán)優(yōu)化器代替原來"-floop-optimize",。該優(yōu)化器將使用不同的選項(xiàng)(-funroll-loops, -fpeel-loops, -funswitch-loops, -ftree-loop-im)分別控制循環(huán)優(yōu)化的不同方面,。目前這個新版本的優(yōu)化器尚在開發(fā)中,,并且生成的代碼質(zhì)量并不比以前的版本高。已廢除,,僅存在于GCC-4.1之前的版本中,。 -funsafe-loop-optimizations 假定循環(huán)不會溢出,并且循環(huán)的退出條件不是無窮,。這將可以在一個比較廣的范圍內(nèi)進(jìn)行循環(huán)優(yōu)化,,即使優(yōu)化器自己也不能斷定這樣做是否正確。 -fsched-spec-load 允許一些裝載指令執(zhí)行一些投機(jī)性的動作,。 -ftree-loop-linear 在trees上進(jìn)行線型循環(huán)轉(zhuǎn)換,。它能夠改進(jìn)緩沖性能并且允許進(jìn)行更進(jìn)一步的循環(huán)優(yōu)化。 -fivopts 在trees上執(zhí)行歸納變量優(yōu)化,。 -ftree-vectorize 在trees上執(zhí)行循環(huán)向量化,。 -ftracer 執(zhí)行尾部復(fù)制以擴(kuò)大超級塊的尺寸,它簡化了函數(shù)控制流,,從而允許其它的優(yōu)化措施做的更好,。據(jù)說挺有效。 -funroll-loops 僅對循環(huán)次數(shù)能夠在編譯時或運(yùn)行時確定的循環(huán)進(jìn)行展開,,生成的代碼尺寸將變大,,執(zhí)行速度可能變快也可能變慢。 -fprefetch-loop-arrays 生成數(shù)組預(yù)讀取指令,,對于使用巨大數(shù)組的程序可以加快代碼執(zhí)行速度,,適合數(shù)據(jù)庫相關(guān)的大型軟件等。具體效果如何取決于代碼,。 -fweb 建立經(jīng)常使用的緩存器網(wǎng)絡(luò),,提供更佳的緩存器使用率。gcc-3.4中曾屬于"-O3"級別的選項(xiàng),。 -ffast-math 違反IEEE/ANSI標(biāo)準(zhǔn)以提高浮點(diǎn)數(shù)計(jì)算速度,是個危險的選項(xiàng),,僅在編譯不需要嚴(yán)格遵守IEEE規(guī)范且浮點(diǎn)計(jì)算密集的程序考慮采用,。 -fsingle-precision-constant 將浮點(diǎn)常量作為單精度常量對待,而不是隱式地將其轉(zhuǎn)換為雙精度,。 -fbranch-probabilities 在使用 -fprofile-arcs 選項(xiàng)編譯程序并執(zhí)行它來創(chuàng)建包含每個代碼塊執(zhí)行次數(shù)的文件之后,,程序可以利用這一選項(xiàng)再次編譯,文件中所產(chǎn)生的信息將被用來優(yōu)化那些經(jīng)常發(fā)生的分支代碼,。如果沒有這些信息,,gcc將猜測那一分支可能經(jīng)常發(fā)生并進(jìn)行優(yōu)化。這類優(yōu)化信息將會存放在一個以源文件為名字的并以".da"為后綴的文件中,。 -frename-registers 試圖驅(qū)除代碼中的假依賴關(guān)系,,這個選項(xiàng)對具有大量寄存器的機(jī)器很有效,。gcc-3.4中曾屬于"-O3"級別的選項(xiàng)。 -fbranch-target-load-optimize 在執(zhí)行序啟動以及結(jié)尾之前執(zhí)行分支目標(biāo)緩存器加載最佳化,。 -fstack-protector 在關(guān)鍵函數(shù)的堆棧中設(shè)置保護(hù)值,。在返回地址和返回值之前,都將驗(yàn)證這個保護(hù)值,。如果出現(xiàn)了緩沖區(qū)溢出,,保護(hù)值不再匹配,程序就會退出,。程序每次運(yùn)行,,保護(hù)值都是隨機(jī)的,因此不會被遠(yuǎn)程猜出,。 -fstack-protector-all 同上,,但是在所有函數(shù)的堆棧中設(shè)置保護(hù)值。 --param max-gcse-memory=xxM 執(zhí)行GCSE優(yōu)化使用的最大內(nèi)存量(xxM),,太小將使該優(yōu)化無法進(jìn)行,,默認(rèn)為50M。 --param max-gcse-passes=n 執(zhí)行GCSE優(yōu)化的最大迭代次數(shù),,默認(rèn)為 1,。 傳遞給匯編器的選項(xiàng): -Wa,options options是一個或多個由逗號分隔的可以傳遞給匯編器的選項(xiàng)列表。其中的每一個均可作為命令行選項(xiàng)傳遞給匯編器,。 -Wa,--strip-local-absolute 從輸出符號表中移除局部絕對符號,。 -Wa,-R 合并數(shù)據(jù)段和正文段,因?yàn)椴槐卦跀?shù)據(jù)段和代碼段之間轉(zhuǎn)移,,所以它可能會產(chǎn)生更短的地址移動,。 -Wa,--64 設(shè)置字長為64bit,僅用于x86_64,,并且僅對ELF格式的目標(biāo)文件有效,。此外,還需要使用"--enable-64-bit-bfd"選項(xiàng)編譯的BFD支持,。 -Wa,-march=CPU 按照特定的CPU進(jìn)行優(yōu)化:pentiumiii, pentium4, prescott, nocona, core, core2; athlon, sledgehammer, opteron, k8 ,。 僅可用于 CFLAGS 的選項(xiàng): -fhosted 按宿主環(huán)境編譯,其中需要有完整的標(biāo)準(zhǔn)庫,,入口必須是main()函數(shù)且具有int型的返回值,。內(nèi)核以外幾乎所有的程序都是如此。該選項(xiàng)隱含設(shè)置了 -fbuiltin,,且與 -fno-freestanding 等價,。 -ffreestanding 按獨(dú)立環(huán)境編譯,該環(huán)境可以沒有標(biāo)準(zhǔn)庫,,且對main()函數(shù)沒有要求,。最典型的例子就是操作系統(tǒng)內(nèi)核,。該選項(xiàng)隱含設(shè)置了 -fno-builtin,且與 -fno-hosted 等價,。 僅可用于 CXXFLAGS 的選項(xiàng): -fno-enforce-eh-specs C++標(biāo)準(zhǔn)要求強(qiáng)制檢查異常違例,,但是該選項(xiàng)可以關(guān)閉違例檢查,從而減小生成代碼的體積,。該選項(xiàng)類似于定義了"NDEBUG"宏,。 -fno-rtti 如果沒有使用'dynamic_cast'和'typeid',可以使用這個選項(xiàng)禁止為包含虛方法的類生成運(yùn)行時表示代碼,,從而節(jié)約空間,。此選項(xiàng)對于異常處理無效(仍然按需生成rtti代碼)。 -ftemplate-depth-n 將最大模版實(shí)例化深度設(shè)為'n',,符合標(biāo)準(zhǔn)的程序不能超過17,,默認(rèn)值為500。 -fno-optional-diags 禁止輸出診斷消息,,C++標(biāo)準(zhǔn)并不需要這些消息,。 -fno-threadsafe-statics GCC自動在訪問C++局部靜態(tài)變量的代碼上加鎖,以保證線程安全,。如果你不需要線程安全,,可以使用這個選項(xiàng)。 -fvisibility-inlines-hidden 默認(rèn)隱藏所有內(nèi)聯(lián)函數(shù),,從而減小導(dǎo)出符號表的大小,,既能縮減文件的大小,還能提高運(yùn)行性能,,我們強(qiáng)烈建議你在編譯任何共享庫的時候使用該選項(xiàng),。參見 -fvisibility=hidden 選項(xiàng)。 LDFLAGSLDFLAGS 是傳遞給連接器的選項(xiàng),。這是一個常被忽視的變量,,事實(shí)上它對優(yōu)化的影響也是很明顯的。 [提示]以下選項(xiàng)是在完整的閱讀了ld-2.18文檔之后挑選出來的選項(xiàng),。http://blog./u1/41220/showart_354602.html 有2.14版本的中文手冊,。 -s 刪除可執(zhí)行程序中的所有符號表和所有重定位信息。其結(jié)果與運(yùn)行命令 strip 所達(dá)到的效果相同,,這個選項(xiàng)是比較安全的。 -Wl,options options是由一個或多個逗號分隔的傳遞給鏈接器的選項(xiàng)列表,。其中的每一個選項(xiàng)均會作為命令行選項(xiàng)提供給鏈接器,。 -Wl,-On 當(dāng)n>0時將會優(yōu)化輸出,但是會明顯增加連接操作的時間,,這個選項(xiàng)是比較安全的,。 -Wl,--exclude-libs=ALL 不自動導(dǎo)出庫中的符號,,也就是默認(rèn)將庫中的符號隱藏。 -Wl,-m<emulation> 仿真<emulation>連接器,,當(dāng)前ld所有可用的仿真可以通過"ld -V"命令獲取,。默認(rèn)值取決于ld的編譯時配置。 -Wl,--sort-common 把全局公共符號按照大小排序后放到適當(dāng)?shù)妮敵龉?jié),,以防止符號間因?yàn)榕挪枷拗贫霈F(xiàn)間隙,。 -Wl,-x 刪除所有的本地符號。 -Wl,-X 刪除所有的臨時本地符號,。對于大多數(shù)目標(biāo)平臺,,就是所有的名字以'L'開頭的本地符號。 -Wl,-zcomberloc 組合多個重定位節(jié)并重新排布它們,,以便讓動態(tài)符號可以被緩存,。 -Wl,--enable-new-dtags 在ELF中創(chuàng)建新式的"dynamic tags",但在老式的ELF系統(tǒng)上無法識別,。 -Wl,--as-needed 移除不必要的符號引用,,僅在實(shí)際需要的時候才連接,可以生成更高效的代碼,。 -Wl,--no-define-common 限制對普通符號的地址分配,。該選項(xiàng)允許那些從共享庫中引用的普通符號只在主程序中被分配地址。這會消除在共享庫中的無用的副本的空間,,同時也防止了在有多個指定了搜索路徑的動態(tài)模塊在進(jìn)行運(yùn)行時符號解析時引起的混亂,。 -Wl,--hash-style=gnu 使用gnu風(fēng)格的符號散列表格式。它的動態(tài)鏈接性能比傳統(tǒng)的sysv風(fēng)格(默認(rèn))有較大提升,,但是它生成的可執(zhí)行程序和庫與舊的Glibc以及動態(tài)鏈接器不兼容,。 最后說兩個與優(yōu)化無關(guān)的系統(tǒng)環(huán)境變量,因?yàn)闀绊慓CC編譯程序的方式,,下面兩個是咱中國人比較關(guān)心的: LANG 指定編譯程序使用的字符集,,可用于創(chuàng)建寬字符文件、串文字,、注釋,;默認(rèn)為英文。[目前只支持日文"C-JIS,C-SJIS,C-EUCJP",,不支持中文] LC_ALL 指定多字節(jié)字符的字符分類,,主要用于確定字符串的字符邊界以及編譯程序使用何種語言發(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",。 |
|