前言
本文用于記錄我在學(xué)習(xí)和工作中遇到的各種GCC選項(xiàng),雖然這些選項(xiàng)可以在GNU的手冊(cè)上查到,不過(guò)這里做個(gè)總結(jié),可以避免每次都去查手冊(cè),算是一個(gè)備忘吧。本文的內(nèi)容會(huì)不斷更新擴(kuò)充。
1 常用的編譯選項(xiàng)
選項(xiàng) | 作用 |
---|---|
-o | 指定輸出文件名稱(chēng) |
-E | 只進(jìn)行預(yù)處理 |
-S | 只進(jìn)行預(yù)處理、編譯 |
-c | 只預(yù)處理、編譯、匯編,但不鏈接 |
-D | 使用-D name[=definition]預(yù)定義名為name的宏,若不指定值則默認(rèn)宏的內(nèi)容為1 |
-l(小寫(xiě)的L) | 使用-l libname或者-llibname,使鏈接器在鏈接時(shí)搜索名為libname.a/libname.so(靜態(tài)/動(dòng)態(tài))的庫(kù)文件 |
-L | 使用-Ldir添加搜索目錄,即鏈接器在搜索-l選項(xiàng)指定的庫(kù)文件時(shí),除了系統(tǒng)的庫(kù)目錄還會(huì)(優(yōu)先)在-L指定的目錄下搜索 |
-I(大寫(xiě)的i) | 使用-I dir,將目錄dir添加為頭文件搜索目錄 |
-include | 使用-include file,等效于在被編譯的源文件開(kāi)頭添加#include "file" |
-static | 指定靜態(tài)鏈接(默認(rèn)是動(dòng)態(tài)鏈接) |
-O0~3 | 開(kāi)啟編譯器優(yōu)化,-O0為不優(yōu)化,-O3為最高級(jí)別的優(yōu)化 |
-Os | 優(yōu)化生成代碼的尺寸,使能所有-O2的優(yōu)化選項(xiàng),除了那些讓代碼體積變大的 |
-Og | 優(yōu)化調(diào)試體驗(yàn),在保留調(diào)試信息的同時(shí)保持快速的編譯,對(duì)于生成可調(diào)試代碼,比-O0更合適,不會(huì)禁用調(diào)試信息。 |
-Wall | 使編譯器輸出所有的警告信息 |
-march | 指定目標(biāo)平臺(tái)的體系結(jié)構(gòu),如-march=armv4t,常用于交叉編譯 |
-mtune | 指定目標(biāo)平臺(tái)的CPU以便GCC優(yōu)化,如-mtune=arm9tdmi,常用于交叉編譯 |
2 其他編譯選項(xiàng)
2.1 -x language
通常gcc通過(guò)源文件的后綴來(lái)判斷該源文件是由什么語(yǔ)言編寫(xiě)的(雖然Linux中后綴沒(méi)有意義),換句話說(shuō),如果我們的文件名不帶后綴,那么gcc就無(wú)法判斷源文件的語(yǔ)言類(lèi)型了,也就無(wú)法完成編譯。舉例來(lái)說(shuō):例1我用c語(yǔ)言編寫(xiě)了一段代碼,將其保存在文件名為main.lll中,執(zhí)行g(shù)cc main.lll會(huì)報(bào)錯(cuò):
main.lll:filenotrecognized:Fileformatnotrecognized collect2:error:ldreturned1exitstatus 12
例2在u-boot中,生成鏈接腳本的命令為arm-linux-gcc -E -Wp,-MD,./.u-boot.lds.d ...... -x assembler-with-cpp -std=c99 -P -o u-boot.lds arch/arm/cpu/u-boot.lds,如果把其中的-x assembler-with-cpp去掉,則編譯器給出如下信息(且不會(huì)生成鏈接腳本):
linkerinputfileunusedbecauselinkingnotdone 1
至此,-x language的作用就很好理解了,當(dāng)我們的源文件不添加常規(guī)的后綴時(shí),使用該選項(xiàng)來(lái)告訴gcc源文件使用了哪種編程語(yǔ)言,其中的language表明的就是語(yǔ)言類(lèi)型,其可取的值有(不是全部):
c c-header cpp-output c++ c+±header c+±cpp-output objective-c objective-c-header objective-c-cpp-output objective-c++ objective-c+±header objective-c+±cpp-output assembler assembler-with-cpp
2.2 -fno-xxx
-fno-common遇到多個(gè)弱定義的全局符號(hào)時(shí)輸出一條警告信息。
-fno-ident忽略#ident命令。
-fno-builtin遇到與內(nèi)建函數(shù)同名的函數(shù)時(shí)不去鏈接內(nèi)建函數(shù),除非函數(shù)名以__builtin_開(kāi)頭,也可以使用-fno-builtin-function來(lái)針對(duì)特定的函數(shù)。
2.3 -fxxx
-ffreestanding告訴編譯器要編譯的目標(biāo)處于獨(dú)立的環(huán)境。在獨(dú)立的環(huán)境中,標(biāo)準(zhǔn)庫(kù)可能不存在,程序的入口也不一定是main。使用該選項(xiàng)的典型例子有bootloader、OS kernel等,這些程序不依賴(lài)標(biāo)準(zhǔn)庫(kù),也不需要編譯器給它們添加.init段。
-fomit-frame-pointer在不需要幀指針的函數(shù)中省略掉幀指針。所謂幀指針,指的是指向一個(gè)函數(shù)的棧幀的底部的指針(棧頂指針是沒(méi)辦法省的)。比如x86平臺(tái)就使用ebp作為幀指針。省略掉幀指針的好處是可以多出一個(gè)可用的寄存器,壞處是不利于?;厮?/strong>。值得注意的是,有些平臺(tái)的過(guò)程調(diào)用規(guī)范指定必須使用幀指針,此時(shí)該選項(xiàng)無(wú)效;同時(shí),與該選項(xiàng)對(duì)應(yīng)的-fno-omit-frame-pointer也不保證幀指針一定會(huì)被使用。
2.4 -Wxxx
-W/-Wextra-W是-Wextra的舊稱(chēng)。顯然,-Wextra更具有可讀性,顧名思義,該選項(xiàng)可以使能一些額外的警告標(biāo)志。所謂額外,是針對(duì)-Wall而言的,-Wall并沒(méi)有使能所有的警告,盡管它有個(gè)all。
-Wshadow使用該選項(xiàng)時(shí),如果本地的變量或類(lèi)型聲明遮蔽了另一個(gè)變量、參數(shù)、類(lèi)型、類(lèi)成員(C++)、實(shí)例變量(Objective-C)或內(nèi)建函數(shù),則gcc會(huì)報(bào)警告。
-Wconversion當(dāng)使用該選項(xiàng)時(shí),如果隱式類(lèi)型轉(zhuǎn)換會(huì)更改變量的值,則gcc會(huì)給出警告。這樣的隱式轉(zhuǎn)換有實(shí)數(shù)與整數(shù)的轉(zhuǎn)換、有符號(hào)數(shù)與無(wú)符號(hào)數(shù)的轉(zhuǎn)換、轉(zhuǎn)向更小類(lèi)型的轉(zhuǎn)換等。當(dāng)然,上述轉(zhuǎn)換中,如果最終沒(méi)有改變變量的值,那么就不會(huì)產(chǎn)生警告,如abs(2.0)。
2.5 -Wno-xxx
-Wno-sign-conversion關(guān)閉有符號(hào)數(shù)和無(wú)符號(hào)數(shù)之間進(jìn)行類(lèi)型轉(zhuǎn)換時(shí)產(chǎn)生的警告,即使用了該選項(xiàng),那么有符號(hào)數(shù)和無(wú)符號(hào)數(shù)之間轉(zhuǎn)換時(shí)gcc就不報(bào)警告了。
2.6 給鏈接器使用的選項(xiàng):-Wl,options
這里所說(shuō)的鏈接器是指集成在可執(zhí)行文件gcc中的鏈接器,而不是單獨(dú)使用的ld。當(dāng)我們通過(guò)gcc間接使用鏈接器時(shí),需要在鏈接器的編譯選項(xiàng)前面加上-Wl,,然后跟著編譯選項(xiàng),即標(biāo)題中的options。GCC手冊(cè)中的相應(yīng)介紹如下:
那么,為什么需要-Wl,前綴呢?GNU的鏈接器手冊(cè)中是這樣解釋的(很好懂,就不翻譯了):
接下來(lái)就介紹一些用于鏈接器的選項(xiàng):
-Wl,-rpath=dir在編譯鏈接時(shí),鏈接器會(huì)在dir目錄下搜索動(dòng)態(tài)庫(kù)。同時(shí),把動(dòng)態(tài)庫(kù)搜索路徑dir添加到可執(zhí)行文件中,以便可執(zhí)行文件加載運(yùn)行時(shí)使用。要注意該選項(xiàng)與-L選項(xiàng)的區(qū)別,-L選項(xiàng)用于編譯鏈接時(shí)添加庫(kù)文件的搜索路徑;而該選項(xiàng)僅限于動(dòng)態(tài)庫(kù),并且既可以在編譯鏈接時(shí)添加搜索路徑,同時(shí)也能將搜索路徑添加到可執(zhí)行文件中。
3 ARM架構(gòu)專(zhuān)有的編譯選項(xiàng)
-mthumb使編譯器生成THUMB指令
-marm使編譯器生成ARM指令
-mthumb-interwork使編譯器生成支持ARM和Thumb指令集之間相互調(diào)用的代碼,默認(rèn)是-mno-thumb-interwork
-
GCC
+關(guān)注
關(guān)注
0文章
105瀏覽量
24821 -
編譯器
+關(guān)注
關(guān)注
1文章
1618瀏覽量
49050
原文標(biāo)題:參考文獻(xiàn)
文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論