版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
精通GCC編譯器contentGCC概論GCC深入探索GCC的編譯選項(xiàng)GCC的應(yīng)用技巧01.GCC是何物?Linux系統(tǒng)下的gcc(GNUCCompiler)是GNU推出的功能強(qiáng)大、性能優(yōu)越的多平臺編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平臺上編譯出可執(zhí)行程序的超級編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%~30%。
gcc編譯器能將C、C++語言源程序、匯程式化序和目標(biāo)程序編譯、連接成可執(zhí)行文件,如果沒有給出可執(zhí)行文件的名字,gcc將生成一個名為a.out的文件。在Linux系統(tǒng)中,可執(zhí)行文件沒有統(tǒng)一的后綴,系統(tǒng)從文件的屬性來區(qū)分可執(zhí)行文件和不可執(zhí)行文件。而gcc則通過后綴來區(qū)別輸入文件的類別,下面我們來介紹gcc所遵循的部分約定規(guī)則。DEMO查看版本信息安裝路徑:相關(guān)文件類型:c
為后綴的文件,C語言源代碼文件;.a
為后綴的文件,是由目標(biāo)文件構(gòu)成的檔案庫文件;.C,.cc或.cxx為后綴的文件,是C++源代碼文件;.h
為后綴的文件,是程序所包含的頭文件;.i
為后綴的文件,是已經(jīng)預(yù)處理過的C源代碼文件;.ii
為后綴的文件,是已經(jīng)預(yù)處理過的C++源代碼文件;.m
為后綴的文件,是Objective-C源代碼文件;.o
為后綴的文件,是編譯后的目標(biāo)文件;.s
為后綴的文件,是匯編語言源代碼文件;.S
為后綴的文件,是經(jīng)過預(yù)編譯的匯編語言源代碼文件。演示:DEMO基本的用法是∶gcc[options][]1、沒有任何選項(xiàng):gcchelloworld.c
結(jié)果會在和helloworld.c相同的目錄下產(chǎn)生一個a.out的可執(zhí)行文檔。2、-o選項(xiàng),指定輸出文檔名:gcc-ohelloworldhelloworld.c
-o意思是Output即需要指定輸出的可執(zhí)行文檔的名稱。這里的名稱為helloworld。3、-c選項(xiàng),只編譯,不匯編連接:gcc-chelloworld.c
-c意思就是Compile,產(chǎn)生一個叫helloworld.o的目標(biāo)文檔4、-S選項(xiàng),產(chǎn)生匯編源文檔:gcc-Shelloworld.c
-S意思就是aSsemble,產(chǎn)生一個叫helloworld.s的匯編源文檔5、-E選項(xiàng),預(yù)處理C源文檔:gcc-Ehelloworld.c
-E意思就是prEprocess。輸出不是送到一個文檔而是標(biāo)準(zhǔn)輸出。當(dāng)然能夠?qū)λM(jìn)行重定向:
gcc-Ehelloworld.c>helloworld.txt優(yōu)化選項(xiàng)
-O選項(xiàng),基本優(yōu)化:gcc-Ohelloworld.c
-O意思就是Optimize,產(chǎn)生一個經(jīng)過優(yōu)化的叫作a.out的可執(zhí)行文檔。也能夠同時使用-o選項(xiàng),以指定輸出文檔名。如:
gcc-O-otesthelloworld.c
即會產(chǎn)生一個叫test的經(jīng)過優(yōu)化的可執(zhí)行文檔。
-O2選項(xiàng),最大優(yōu)化:gcc-O2helloworld.c
產(chǎn)生一個經(jīng)過最大優(yōu)化的叫作a.out的可執(zhí)行文檔。02.GCC快速入門第一個實(shí)例hello!DEMOGCC常用編譯開關(guān)-w禁止輸出警告消息-Werror將所有警告轉(zhuǎn)換為錯誤-Wall顯示所有的警告消息-v顯示編譯程序的當(dāng)前版本號-static連接器將忽略動態(tài)連接庫,同時通過將靜態(tài)目標(biāo)文件直接包含到結(jié)果目標(biāo)文件完成對所有引用的解析。-shared-fPCI連接器將生成共享目標(biāo)代碼,-pipe使用管道而不是臨時文件一個階段到另一個階段交換輸出的方式,可以加快編譯速度。建議使用。-o<>指定輸出文件,對各種輸出皆有效。-I<dir>指定搜索系統(tǒng)頭文件的目錄,可以重復(fù)使用多個該選項(xiàng)指定多個目錄-Dmacro:相當(dāng)于C語言中的#definemacro-UMACRO取消對MACRO宏的定義-c/-C:只激活預(yù)處理,編譯,和匯編,也就是他只把程序做成obj文件-o:指定目標(biāo)名稱-On(0,1,2,3):-S:只激活預(yù)處理和編譯,就是指把文件編譯成為匯編代碼-E:只激活預(yù)處理,這個不生成文件,你需要把它重定向到一個輸出文件里面.建立自己的GCC編譯環(huán)境一個系統(tǒng)上如何同時存在并使用多個版本的GCC編譯器?建立目標(biāo)目錄:在gcc源代碼同一級目錄下(與源目錄${srcdir}是同級目錄)%mkdirgcc-build%cdgcc-build配置環(huán)境:%../gcc-3.4.0/configure--prefix=/usr/local/gcc-3.4.0--enable-threads=posix--disable-checking--enable--long-long--host=i386-redhat-linux--with-system-zlib--enable-languages=c,c++,java將GCC安裝在/usr/local/gcc-3.4.0目錄下,支持C/C++和JAVA語言編譯安裝:%make&&makeinstall其它配置:GCC3.4.0的所有文件,包括命令文件(如gcc、g++)、庫文件等都在${destdir}目錄下分別存放,如命令文件放在bin目錄下、庫文件在lib下、頭文件在include下等。由于命令文件和庫文件所在的目錄還沒有包含在相應(yīng)的搜索路徑內(nèi),所以必須要作適當(dāng)?shù)脑O(shè)置之后編譯器才能順利地找到并使用它們。用符號連接的方式實(shí)現(xiàn),這樣做的好處是我仍然可以使用系統(tǒng)上原來的舊版本的GCC編譯器。%ln-s${destdir}/bin/gccgcc34庫路徑的設(shè)置:exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:{destdir}/libsetenvLD_LIBRARY_PATH /usr/local/gcc-3.4.0/lib:$LD_LIBRARY_PATH03.GCC的編譯環(huán)境工具:gccc編譯器,它在鏈接時使用c庫cc1實(shí)際的c編譯器cc1plus實(shí)際的c++編譯器collect2使用collect2產(chǎn)生特定的全局初始化代碼,后臺處理是傳遞參數(shù)給ld完成實(shí)際的鏈接工作。crt0.o初始化和結(jié)束代碼libgcc平臺相關(guān)的庫gcc預(yù)處理相關(guān)#defineTEST(ARGTERM)printf(“theterm“#ARGTERM“isastring\n”)#defineerr(...)fprintf(stderr,_VA_ARGS__)
err("%s%d\n","errorcodeis",48);//實(shí)現(xiàn)可變參數(shù)宏的定義.error和warning指令if,elif,else,endif指令gcc預(yù)定義宏
__BASE_FILE__完整的源文件名路徑
__cplusplus測試c++程序
__DATE__日期
__FILE__源文件名
__func__替代__FUNCTION__,__FUNCTION__以被GNU不推薦使用
__TIME__日期
__LINE__行數(shù)
__VERSION__gcc版本gas匯編工具(AT&T的風(fēng)格)ld:ld把一定量的目標(biāo)文件跟檔案文件連接起來,并重定位它們的數(shù)據(jù),連接符號引用.一般在編譯一個程序時,最后一步就是運(yùn)行l(wèi)d。 autoscanfautomake等工具運(yùn)行環(huán)境變量路徑的問題autoconf主要根據(jù)程式員提供的configure.in,生成能夠自動檢測系統(tǒng)配置的腳本configure。而后再由configure根據(jù)各目錄下的Make自動生成Makefile。這樣,程式員就能夠直接使用具備豐富功能的Makefile了。autoconf產(chǎn)生makefile的過程:運(yùn)行autoscan命令將configure.scan文檔重命名為configure.in,并修改configure.in文檔在project目錄下新建Make文檔,并在core和shell目錄下也新建make文檔在project目錄下新建NEWS、README、ChangeLog、AUTHORS文檔將/usr/share/automake-1.X/目錄下的depcomp和complie文檔拷貝到本目錄下運(yùn)行aclocal命令運(yùn)行autoconf命令運(yùn)行automake-a命令運(yùn)行./confiugre腳本從編譯過程自身來看,將源代碼編譯為二進(jìn)制文件是在Makefile文件的指導(dǎo)下,由make程序調(diào)用一條條編譯命令完成的。而將源代碼編譯為二進(jìn)制文件又需要經(jīng)過以下四個步驟:預(yù)處理(cpp)→編譯(gcc或g++)→匯編(as)→連接(ld);括號中表示每個階段所使用的程序,它們分別屬于GCC和Binutils軟件包。顯然優(yōu)化應(yīng)當(dāng)從編譯工具自身的選擇以及控制編譯工具的行為入手。常用優(yōu)化選項(xiàng)gcc默認(rèn)提供了5級優(yōu)化選項(xiàng)的集合:-O0:無優(yōu)化(默認(rèn))-O和-O1:使用能減少目標(biāo)文件大小以及執(zhí)行時間并且不會使編譯時間明顯增加的優(yōu)化.在編譯大型程序的時候會顯著增加編譯時內(nèi)存的使用.-O2:包含-O1的優(yōu)化并增加了不需要在目標(biāo)文件大小和執(zhí)行速度上進(jìn)行折衷的優(yōu)化.編譯器不執(zhí)行循環(huán)展開以及函數(shù)內(nèi)聯(lián).此選項(xiàng)將增加編譯時間和目標(biāo)文件的執(zhí)行性能.-Os:專門優(yōu)化目標(biāo)文件大小,執(zhí)行所有的不增加目標(biāo)文件大小的-O2優(yōu)化選項(xiàng).并且執(zhí)行專門減小目標(biāo)文件大小的優(yōu)化選項(xiàng).-O3:打開所有-O2的優(yōu)化選項(xiàng)并且增加-finline-functions,-funswitch-loops,-fpredictive-commoning,-fgcse-after-reloadand-ftree-vectorize優(yōu)化選項(xiàng).05.GCC與GDBDebug選項(xiàng):在gcc編譯源代碼時指定-g選項(xiàng)可以產(chǎn)生帶有調(diào)試信息的目標(biāo)代碼,gcc可以為多個不同平臺上帝不同調(diào)試器提供調(diào)試信息,默認(rèn)gcc產(chǎn)生的調(diào)試信息是為gdb使用的,可以使用-gformat指定要生成的調(diào)試信息的格式以提供給其他平臺的其他調(diào)試器使用.常用的格式有-ggdb:生成gdb專用的調(diào)試信息,使用最適合的格式(DWARF2,stabs等)會有一些gdb專用的擴(kuò)展,可能造成其他調(diào)試器無法運(yùn)行.可以指定調(diào)試信息的等級:在指定的調(diào)試格式后面加上等級:如:-ggdb2等,0代表不產(chǎn)生調(diào)試信息.在使用-gdwarf-2時因?yàn)樽钤绲母袷綖?gdwarf2會造成混亂,所以要額外使用一個-glevel來指定調(diào)試信息的等級,其他格式選項(xiàng)也可以另外指定等級.GCC的編譯錯誤類型C語法錯誤錯誤資訊∶文件source.c中第n行有語法錯誤(syntexerrror)頭文件錯誤錯誤資訊∶找不到頭文件head.h(Cannotfindinclude)檔案庫錯誤錯誤資訊∶連接程序找不到所需的函數(shù)庫未定義符號錯誤資訊∶有未定義的符號(Undefinedsymbol)。通常可以使用-Wall來開啟以下警告:-Waddress-Warray-bounds(onlywith-O2)-Wc++0x-compat-Wchar-subscripts-Wimplicit-int-Wimplicit-function-declaration-Wcomment-Wformat-Wmain(onlyforC/ObjCandunless
-ffreestanding)-Wmissing-braces-Wnonnull-Wparentheses
-Wpointer-sign-Wreorder-Wreturn-type-Wsequence-point-Wsign-compare(onlyinC++)-Wstrict-aliasing-Wstrict-overflow=1-Wswitch-Wtrigraphs-Wuninitialized(onlywith-O1andabove)
-Wunknown-pragmas-Wunused-function-Wunused-label-Wunused-value-Wunused-variable
unused-function:
警告聲明但是沒有定義的static函數(shù);unused-label:
聲明但是未使用的標(biāo)簽;unused-parameter:
警告未使用的函數(shù)參數(shù);unused-variable:
聲明但是未使用的本地變量;unused-value:
計(jì)算了但是未使用的值;format:
printf和scanf這樣的函數(shù)中的格式字符串的使用不當(dāng);implicit-int:
未指定類型;implicit-function:
函數(shù)在聲明前使用;char-subscripts:
使用char類作為數(shù)組下標(biāo)(因?yàn)閏har可能是有符號數(shù));
missingbraces:
大括號不匹配;parentheses:
圓括號不匹配;return-type:
函數(shù)有無返回值以及返回值類型不匹配;sequence-point:
違反順序點(diǎn)的代碼,比如a[i]=c[i++];switch:
switch語句缺少default或者switch使用枚舉變量為索引時缺少某個變量的case;strict-aliasing=n:
使用n設(shè)置對指針變量指向的對象類型產(chǎn)生警告的限制程度,默認(rèn)n=3;只有在-fstrict-aliasing設(shè)置的情況下有效;unknow-pragmas:
使用未知的#pragma指令;uninitialized:
使用的變量為初始化,只在-O2時有效;以下是在-Wall中不會激活的警告選項(xiàng):cast-align:
當(dāng)指針進(jìn)行類型轉(zhuǎn)換后有內(nèi)存對齊要求更嚴(yán)格時發(fā)出警告;sign-compare:
當(dāng)使用signed和unsigned類型比較時;missing-prototypes:當(dāng)函數(shù)在使用前沒有函數(shù)原型時;packed:
packed是gcc的一個擴(kuò)展,是使結(jié)構(gòu)體各成員之間不留內(nèi)存對齊所需的空間,有時候會造成內(nèi)存對齊的問題;padded:
也是gcc的擴(kuò)展,使結(jié)構(gòu)體成員之間進(jìn)行內(nèi)存對齊的填充,會造成結(jié)構(gòu)體體積增大.unreachable-code:
有不會執(zhí)行的代碼時.inline:
當(dāng)inline函數(shù)不再保持inline時(比如對inline函數(shù)取地址);disable-optimization:
當(dāng)不能執(zhí)行指定的優(yōu)化時.(需要太多時間或系統(tǒng)資源).
可以使用-Werror時所有的警告都變成錯誤,使出現(xiàn)警告時也停止編譯.需要和指定警告的參數(shù)一起使用06.GCC交叉編譯器制作交叉編譯器一般分四步:制作交叉的二進(jìn)制工具制作不帶庫的gcc交叉編譯器用制作好的gcc交叉編譯器將所需要的庫編譯重新編譯帶庫的gcc交叉編譯器cross-3.4.1.tar.bz207.小結(jié)為什么選擇GCCGCC編譯包括那些過程?中間的過程文件類型包括那些?怎樣對Gcc的編譯過程進(jìn)行優(yōu)化?如何打造自己個性化的Gcc編譯環(huán)境?GCC和GDB的關(guān)系?Gcc與arm-linux-gcc的區(qū)別?
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 最簡單的房屋出租合同范本(30篇)
- 二年級數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)1000題匯編集錦
- 市中心社區(qū)房屋買賣代理合同(31篇)
- 食品買賣合同書(33篇)
- 婚慶協(xié)會授權(quán)合同范例
- 2024年攜手共創(chuàng):代理商合作合同范本
- 企業(yè)加盟授權(quán)合同范例
- 合同模板發(fā)票
- 學(xué)校個人合同范例
- 個體之間承包合同模板
- 銷售技巧之導(dǎo)購六式
- GB/T 41715-2022定向刨花板
- YC/T 384.3-2018煙草企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化規(guī)范第3部分:考核評價(jià)準(zhǔn)則和方法
- 夏商周考古課件 第5章 西周文化(3節(jié))
- GB/T 7324-2010通用鋰基潤滑脂
- GB/T 4459.1-1995機(jī)械制圖螺紋及螺紋緊固件表示法
- 危險(xiǎn)化學(xué)品安全告知牌硝酸、鹽酸、硫酸、氫氧化鈉
- 上海英文介紹課件
- 上交所個股期權(quán)基礎(chǔ)知識課件
- 最新山羊、綿羊人工授精技術(shù)及新技術(shù)介紹(含人工授精視頻)課件
- 2022年征信知識競賽基礎(chǔ)題題庫(含各題型)
評論
0/150
提交評論