開放、自由和靈活是Linux的魅力所在,而這一點(diǎn)在GCC上的體現(xiàn)就是程序員通過它能夠更好地控制整個編譯過程。在使用GCC編譯程序時,編譯過程可以被細(xì)分為四個階段:
◆ 預(yù)處理(Pre-Processing)
◆ 編譯(Compiling)
◆ 匯編(Assembling)
◆ 鏈接(Linking)
Linux程序員可以根據(jù)自己的需要讓GCC在編譯的任何階段結(jié)束,以便檢查或使用編譯器在該階段的輸出信息,或者對最后生成的二進(jìn)制文件進(jìn)行控制,以便通過加入不同數(shù)量和種類的調(diào)試代碼來為今后的調(diào)試做好準(zhǔn)備。和其它常用的編譯器一樣,GCC也提供了靈活而強(qiáng)大的代碼優(yōu)化功能,利用它可以生成執(zhí)行效率更高的代碼。
GCC提供了30多條警告信息和三個警告級別,使用它們有助于增強(qiáng)程序的穩(wěn)定性和可移植性。此外,GCC還對標(biāo)準(zhǔn)的C和C++語言進(jìn)行了大量的擴(kuò)展,提高程序的執(zhí)行效率,有助于編譯器進(jìn)行代碼優(yōu)化,能夠減輕編程的工作量。
GCC起步
在學(xué)習(xí)使用GCC之前,下面的這個例子能夠幫助用戶迅速理解GCC的工作原理,并將其立即運(yùn)用到實(shí)際的項(xiàng)目開發(fā)中去。首先用熟悉的編輯器輸入清單1所示的代碼:
清單1:hello.c
|
然后執(zhí)行下面的命令編譯和運(yùn)行這段程序:
|
從程序員的角度看,只需簡單地執(zhí)行一條GCC命令就可以了,但從編譯器的角度來看,卻需要完成一系列非常繁雜的工作。首先,GCC需要調(diào)用預(yù)處理程序cpp,由它負(fù)責(zé)展開在源文件中定義的宏,并向其中插入“#include”語句所包含的內(nèi)容;接著,GCC會調(diào)用ccl和as將處理后的源代碼編譯成目標(biāo)代碼;最后,GCC會調(diào)用鏈接程序ld,把生成的目標(biāo)代碼鏈接成一個可執(zhí)行程序。
為了更好地理解GCC的工作過程,可以把上述編譯過程分成幾個步驟單獨(dú)進(jìn)行,并觀察每步的運(yùn)行結(jié)果。第一步是進(jìn)行預(yù)編譯,使用-E參數(shù)可以讓GCC在預(yù)處理結(jié)束后停止編譯過程:
|
此時若查看hello.cpp文件中的內(nèi)容,會發(fā)現(xiàn)stdio.h的內(nèi)容確實(shí)都插到文件里去了,而其它應(yīng)當(dāng)被預(yù)處理的宏定義也都做了相應(yīng)的處理。下一步是將hello.i編譯為目標(biāo)代碼,這可以通過使用-c參數(shù)來完成:
|
GCC默認(rèn)將.i文件看成是預(yù)處理后的C語言源代碼,因此上述命令將自動跳過預(yù)處理步驟而開始執(zhí)行編譯過程,也可以使用-x參數(shù)讓GCC從指定的步驟開始編譯。最后一步是將生成的目標(biāo)文件鏈接成可執(zhí)行文件:
|
在采用模塊化的設(shè)計思想進(jìn)行軟件開發(fā)時,通常整個程序是由多個源文件組成的,相應(yīng)地也就形成了多個編譯單元,使用GCC能夠很好地管理這些編譯單元。假設(shè)有一個由foo1.c和foo2.c兩個源文件組成的程序,為了對它們進(jìn)行編譯,并最終生成可執(zhí)行程序foo,可以使用下面這條命令:
|
如果同時處理的文件不止一個,GCC仍然會按照預(yù)處理、編譯和鏈接的過程依次進(jìn)行。如果深究起來,上面這條命令大致相當(dāng)于依次執(zhí)行如下三條命令:
|
在編譯一個包含許多源文件的工程時,若只用一條GCC命令來完成編譯是非常浪費(fèi)時間的。假設(shè)項(xiàng)目中有100個源文件需要編譯,并且每個源文件中都包含10000行代碼,如果像上面那樣僅用一條GCC命令來完成編譯工作,那么GCC需要將每個源文件都重新編譯一遍,然后再全部連接起來。很顯然,這樣浪費(fèi)的時間相當(dāng)多,尤其是當(dāng)用戶只是修改了其中某一個文件的時候,完全沒有必要將每個文件都重新編譯一遍,因?yàn)楹芏嘁呀?jīng)生成的目標(biāo)文件是不會改變的。要解決這個問題,關(guān)鍵是要靈活運(yùn)用GCC,同時還要借助像Make這樣的工具。
警告提示功能
GCC包含完整的出錯檢查和警告提示功能,它們可以幫助Linux程序員寫出更加專業(yè)和優(yōu)美的代碼。先來讀讀清單2所示的程序,這段代碼寫得很糟糕,仔細(xì)檢查一下不難挑出很多毛病:
◆main函數(shù)的返回值被聲明為void,但實(shí)際上應(yīng)該是int;
◆使用了GNU語法擴(kuò)展,即使用long long來聲明64位整數(shù),不符合ANSI/ISO C語言標(biāo)準(zhǔn);
◆main函數(shù)在終止前沒有調(diào)用return語句。
清單2:illcode.c
|
下面來看看GCC是如何幫助程序員來發(fā)現(xiàn)這些錯誤的。當(dāng)GCC在編譯不符合ANSI/ISO C語言標(biāo)準(zhǔn)的源代碼時,如果加上了-pedantic選項(xiàng),那么使用了擴(kuò)展語法的地方將產(chǎn)生相應(yīng)的警告信息:
|
需要注意的是,-pedantic編譯選項(xiàng)并不能保證被編譯程序與ANSI/ISO C標(biāo)準(zhǔn)的完全兼容,它僅僅只能用來幫助Linux程序員離這個目標(biāo)越來越近。或者換句話說,-pedantic選項(xiàng)能夠幫助程序員發(fā)現(xiàn)一些不符合ANSI/ISO C標(biāo)準(zhǔn)的代碼,但不是全部,事實(shí)上只有ANSI/ISO C語言標(biāo)準(zhǔn)中要求進(jìn)行編譯器診斷的那些情況,才有可能被GCC發(fā)現(xiàn)并提出警告。
除了-pedantic之外,GCC還有一些其它編譯選項(xiàng)也能夠產(chǎn)生有用的警告信息。這些選項(xiàng)大多以-W開頭,其中最有價值的當(dāng)數(shù)-Wall了,使用它能夠使GCC產(chǎn)生盡可能多的警告信息:
|
GCC給出的警告信息雖然從嚴(yán)格意義上說不能算作是錯誤,但卻很可能成為錯誤的棲身之所。一個優(yōu)秀的Linux程序員應(yīng)該盡量避免產(chǎn)生警告信息,使自己的代碼始終保持簡潔、優(yōu)美和健壯的特性。
在處理警告方面,另一個常用的編譯選項(xiàng)是-Werror,它要求GCC將所有的警告當(dāng)成錯誤進(jìn)行處理,這在使用自動編譯工具(如Make等)時非常有用。如果編譯時帶上-Werror選項(xiàng),那么GCC會在所有產(chǎn)生警告的地方停止編譯,迫使程序員對自己的代碼進(jìn)行修改。只有當(dāng)相應(yīng)的警告信息消除時,才可能將編譯過程繼續(xù)朝前推進(jìn)。執(zhí)行情況如下:
|
對Linux程序員來講,GCC給出的警告信息是很有價值的,它們不僅可以幫助程序員寫出更加健壯的程序,而且還是跟蹤和調(diào)試程序的有力工具。建議在用GCC編譯源代碼時始終帶上-Wall選項(xiàng),并把它逐漸培養(yǎng)成為一種習(xí)慣,這對找出常見的隱式編程錯誤很有幫助。
庫依賴
在Linux下開發(fā)軟件時,完全不使用第三方函數(shù)庫的情況是比較少見的,通常來講都需要借助一個或多個函數(shù)庫的支持才能夠完成相應(yīng)的功能。從程序員的角度看,函數(shù)庫實(shí)際上就是一些頭文件(.h)和庫文件(.so或者.a)的集合。雖然Linux下的大多數(shù)函數(shù)都默認(rèn)將頭文件放到/usr/include/目錄下,而庫文件則放到/usr/lib/目錄下,但并不是所有的情況都是這樣。正因如此,GCC在編譯時必須有自己的辦法來查找所需要的頭文件和庫文件。
GCC采用搜索目錄的辦法來查找所需要的文件,-I選項(xiàng)可以向GCC的頭文件搜索路徑中添加新的目錄。例如,如果在/home/xiaowp/include/目錄下有編譯時所需要的頭文件,為了讓GCC能夠順利地找到它們,就可以使用-I選項(xiàng):
|
同樣,如果使用了不在標(biāo)準(zhǔn)位置的庫文件,那么可以通過-L選項(xiàng)向GCC的庫文件搜索路徑中添加新的目錄。例如,如果在/home/xiaowp/lib/目錄下有鏈接時所需要的庫文件libfoo.so,為了讓GCC能夠順利地找到它,可以使用下面的命令:
|
值得好好解釋一下的是-l選項(xiàng),它指示GCC去連接庫文件libfoo.so。Linux下的庫文件在命名時有一個約定,那就是應(yīng)該以lib三個字母開頭,由于所有的庫文件都遵循了同樣的規(guī)范,因此在用-l選項(xiàng)指定鏈接的庫文件名時可以省去lib三個字母,也就是說GCC在對-lfoo進(jìn)行處理時,會自動去鏈接名為libfoo.so的文件。
Linux下的庫文件分為兩大類分別是動態(tài)鏈接庫(通常以.so結(jié)尾)和靜態(tài)鏈接庫(通常以.a結(jié)尾),兩者的差別僅在程序執(zhí)行時所需的代碼是在運(yùn)行時動態(tài)加載的,還是在編譯時靜態(tài)加載的。默認(rèn)情況下,GCC在鏈接時優(yōu)先使用動態(tài)鏈接庫,只有當(dāng)動態(tài)鏈接庫不存在時才考慮使用靜態(tài)鏈接庫,如果需要的話可以在編譯時加上-static選項(xiàng),強(qiáng)制使用靜態(tài)鏈接庫。例如,如果在/home/xiaowp/lib/目錄下有鏈接時所需要的庫文件libfoo.so和libfoo.a,為了讓GCC在鏈接時只用到靜態(tài)鏈接庫,可以使用下面的命令:
|
代碼優(yōu)化
代碼優(yōu)化指的是編譯器通過分析源代碼,找出其中尚未達(dá)到最優(yōu)的部分,然后對其重新進(jìn)行組合,目的是改善程序的執(zhí)行性能。GCC提供的代碼優(yōu)化功能非常強(qiáng)大,它通過編譯選項(xiàng)-On來控制優(yōu)化代碼的生成,其中n是一個代表優(yōu)化級別的整數(shù)。對于不同版本的GCC來講,n的取值范圍及其對應(yīng)的優(yōu)化效果可能并不完全相同,比較典型的范圍是從0變化到2或3。
編譯時使用選項(xiàng)-O可以告訴GCC同時減小代碼的長度和執(zhí)行時間,其效果等價于-O1。在這一級別上能夠進(jìn)行的優(yōu)化類型雖然取決于目標(biāo)處理器,但一般都會包括線程跳轉(zhuǎn)(Thread Jump)和延遲退棧(Deferred Stack Pops)兩種優(yōu)化。選項(xiàng)-O2告訴GCC除了完成所有-O1級別的優(yōu)化之外,同時還要進(jìn)行一些額外的調(diào)整工作,如處理器指令調(diào)度等。選項(xiàng)-O3則除了完成所有-O2級別的優(yōu)化之外,還包括循環(huán)展開和其它一些與處理器特性相關(guān)的優(yōu)化工作。通常來說,數(shù)字越大優(yōu)化的等級越高,同時也就意味著程序的運(yùn)行速度越快。許多Linux程序員都喜歡使用-O2選項(xiàng),因?yàn)樗趦?yōu)化長度、編譯時間和代碼大小之間,取得了一個比較理想的平衡點(diǎn)。
下面通過具體實(shí)例來感受一下GCC的代碼優(yōu)化功能,所用程序如清單3所示。
清單3:optimize.c
|
首先不加任何優(yōu)化選項(xiàng)進(jìn)行編譯:
|
借助Linux提供的time命令,可以大致統(tǒng)計出該程序在運(yùn)行時所需要的時間:
|
接下去使用優(yōu)化選項(xiàng)來對代碼進(jìn)行優(yōu)化處理:
|
在同樣的條件下再次測試一下運(yùn)行時間:
|
對比兩次執(zhí)行的輸出結(jié)果不難看出,程序的性能的確得到了很大幅度的改善,由原來的14秒縮短到了3秒。這個例子是專門針對GCC的優(yōu)化功能而設(shè)計的,因此優(yōu)化前后程序的執(zhí)行速度發(fā)生了很大的改變。盡管GCC的代碼優(yōu)化功能非常強(qiáng)大,但作為一名優(yōu)秀的Linux程序員,首先還是要力求能夠手工編寫出高質(zhì)量的代碼。如果編寫的代碼簡短,并且邏輯性強(qiáng),編譯器就不會做更多的工作,甚至根本用不著優(yōu)化。
優(yōu)化雖然能夠給程序帶來更好的執(zhí)行性能,但在如下一些場合中應(yīng)該避免優(yōu)化代碼:
◆ 程序開發(fā)的時候 優(yōu)化等級越高,消耗在編譯上的時間就越長,因此在開發(fā)的時候最好不要使用優(yōu)化選項(xiàng),只有到軟件發(fā)行或開發(fā)結(jié)束的時候,才考慮對最終生成的代碼進(jìn)行優(yōu)化。
◆ 資源受限的時候 一些優(yōu)化選項(xiàng)會增加可執(zhí)行代碼的體積,如果程序在運(yùn)行時能夠申請到的內(nèi)存資源非常緊張(如一些實(shí)時嵌入式設(shè)備),那就不要對代碼進(jìn)行優(yōu)化,因?yàn)橛蛇@帶來的負(fù)面影響可能會產(chǎn)生非常嚴(yán)重的后果。
◆ 跟蹤調(diào)試的時候 在對代碼進(jìn)行優(yōu)化的時候,某些代碼可能會被刪除或改寫,或者為了取得更佳的性能而進(jìn)行重組,從而使跟蹤和調(diào)試變得異常困難。
調(diào)試
一個功能強(qiáng)大的調(diào)試器不僅為程序員提供了跟蹤程序執(zhí)行的手段,而且還可以幫助程序員找到解決問題的方法。對于Linux程序員來講,GDB(GNU Debugger)通過與GCC的配合使用,為基于Linux的軟件開發(fā)提供了一個完善的調(diào)試環(huán)境。
默認(rèn)情況下,GCC在編譯時不會將調(diào)試符號插入到生成的二進(jìn)制代碼中,因?yàn)檫@樣會增加可執(zhí)行文件的大小。如果需要在編譯時生成調(diào)試符號信息,可以使用GCC的-g或者-ggdb選項(xiàng)。GCC在產(chǎn)生調(diào)試符號時,同樣采用了分級的思路,開發(fā)人員可以通過在-g選項(xiàng)后附加數(shù)字1、2或3來指定在代碼中加入調(diào)試信息的多少。默認(rèn)的級別是2(-g2),此時產(chǎn)生的調(diào)試信息包括擴(kuò)展的符號表、行號、局部或外部變量信息。級別3(-g3)包含級別2中的所有調(diào)試信息,以及源代碼中定義的宏。級別1(-g1)不包含局部變量和與行號有關(guān)的調(diào)試信息,因此只能夠用于回溯跟蹤和堆棧轉(zhuǎn)儲之用。回溯跟蹤指的是監(jiān)視程序在運(yùn)行過程中的函數(shù)調(diào)用歷史,堆棧轉(zhuǎn)儲則是一種以原始的十六進(jìn)制格式保存程序執(zhí)行環(huán)境的方法,兩者都是經(jīng)常用到的調(diào)試手段。
GCC產(chǎn)生的調(diào)試符號具有普遍的適應(yīng)性,可以被許多調(diào)試器加以利用,但如果使用的是GDB,那么還可以通過-ggdb選項(xiàng)在生成的二進(jìn)制代碼中包含GDB專用的調(diào)試信息。這種做法的優(yōu)點(diǎn)是可以方便GDB的調(diào)試工作,但缺點(diǎn)是可能導(dǎo)致其它調(diào)試器(如DBX)無法進(jìn)行正常的調(diào)試。選項(xiàng)-ggdb能夠接受的調(diào)試級別和-g是完全一樣的,它們對輸出的調(diào)試符號有著相同的影響。
需要注意的是,使用任何一個調(diào)試選項(xiàng)都會使最終生成的二進(jìn)制文件的大小急劇增加,同時增加程序在執(zhí)行時的開銷,因此調(diào)試選項(xiàng)通常僅在軟件的開發(fā)和調(diào)試階段使用。調(diào)試選項(xiàng)對生成代碼大小的影響從下面的對比過程中可以看出來:
|
雖然調(diào)試選項(xiàng)會增加文件的大小,但事實(shí)上Linux中的許多軟件在測試版本甚至最終發(fā)行版本中仍然使用了調(diào)試選項(xiàng)來進(jìn)行編譯,這樣做的目的是鼓勵用戶在發(fā)現(xiàn)問題時自己動手解決,是Linux的一個顯著特色。
下面還是通過一個具體的實(shí)例說明如何利用調(diào)試符號來分析錯誤,所用程序見清單4所示。
清單4:crash.c
|
編譯并運(yùn)行上述代碼,會產(chǎn)生一個嚴(yán)重的段錯誤(Segmentation fault)如下:
|
為了更快速地發(fā)現(xiàn)錯誤所在,可以使用GDB進(jìn)行跟蹤調(diào)試,方法如下:
|
當(dāng)GDB提示符出現(xiàn)的時候,表明GDB已經(jīng)做好準(zhǔn)備進(jìn)行調(diào)試了,現(xiàn)在可以通過run命令讓程序開始在GDB的監(jiān)控下運(yùn)行:
|
仔細(xì)分析一下GDB給出的輸出結(jié)果不難看出,程序是由于段錯誤而導(dǎo)致異常中止的,說明內(nèi)存操作出了問題,具體發(fā)生問題的地方是在調(diào)用_IO_vfscanf_internal ( )的時候。為了得到更加有價值的信息,可以使用GDB提供的回溯跟蹤命令backtrace,執(zhí)行結(jié)果如下:
|
跳過輸出結(jié)果中的前面三行,從輸出結(jié)果的第四行中不難看出,GDB已經(jīng)將錯誤定位到crash.c中的第11行了。現(xiàn)在仔細(xì)檢查一下:
|
使用GDB提供的frame命令可以定位到發(fā)生錯誤的代碼段,該命令后面跟著的數(shù)值可以在backtrace命令輸出結(jié)果中的行首找到。現(xiàn)在已經(jīng)發(fā)現(xiàn)錯誤所在了,應(yīng)該將
|
完成后就可以退出GDB了,命令如下:
|
GDB的功能遠(yuǎn)遠(yuǎn)不止如此,它還可以單步跟蹤程序、檢查內(nèi)存變量和設(shè)置斷點(diǎn)等。
調(diào)試時可能會需要用到編譯器產(chǎn)生的中間結(jié)果,這時可以使用-save-temps選項(xiàng),讓GCC將預(yù)處理代碼、匯編代碼和目標(biāo)代碼都作為文件保存起來。如果想檢查生成的代碼是否能夠通過手工調(diào)整的辦法來提高執(zhí)行性能,在編譯過程中生成的中間文件將會很有幫助,具體情況如下:
|
GCC支持的其它調(diào)試選項(xiàng)還包括-p和-pg,它們會將剖析(Profiling)信息加入到最終生成的二進(jìn)制代碼中。剖析信息對于找出程序的性能瓶頸很有幫助,是協(xié)助Linux程序員開發(fā)出高性能程序的有力工具。在編譯時加入-p選項(xiàng)會在生成的代碼中加入通用剖析工具(Prof)能夠識別的統(tǒng)計信息,而-pg選項(xiàng)則生成只有GNU剖析工具(Gprof)才能識別的統(tǒng)計信息。
最后提醒一點(diǎn),雖然GCC允許在優(yōu)化的同時加入調(diào)試符號信息,但優(yōu)化后的代碼對于調(diào)試本身而言將是一個很大的挑戰(zhàn)。代碼在經(jīng)過優(yōu)化之后,在源程序中聲明和使用的變量很可能不再使用,控制流也可能會突然跳轉(zhuǎn)到意外的地方,循環(huán)語句有可能因?yàn)檠h(huán)展開而變得到處都有,所有這些對調(diào)試來講都將是一場噩夢。建議在調(diào)試的時候最好不使用任何優(yōu)化選項(xiàng),只有當(dāng)程序在最終發(fā)行的時候才考慮對其進(jìn)行優(yōu)化。
上次的培訓(xùn)園地中介紹了GCC的編譯過程、警告提示功能、庫依賴、代碼優(yōu)化和程序調(diào)試六個方面的內(nèi)容。這期是最后的一部分內(nèi)容。
加速
在將源代碼變成可執(zhí)行文件的過程中,需要經(jīng)過許多中間步驟,包含預(yù)處理、編譯、匯編和連接。這些過程實(shí)際上是由不同的程序負(fù)責(zé)完成的。大多數(shù)情況下GCC可以為Linux程序員完成所有的后臺工作,自動調(diào)用相應(yīng)程序進(jìn)行處理。
這樣做有一個很明顯的缺點(diǎn),就是GCC在處理每一個源文件時,最終都需要生成好幾個臨時文件才能完成相應(yīng)的工作,從而無形中導(dǎo)致處理速度變慢。例如,GCC在處理一個源文件時,可能需要一個臨時文件來保存預(yù)處理的輸出、一個臨時文件來保存編譯器的輸出、一個臨時文件來保存匯編器的輸出,而讀寫這些臨時文件顯然需要耗費(fèi)一定的時間。當(dāng)軟件項(xiàng)目變得非常龐大的時候,花費(fèi)在這上面的代價可能會變得很沉重。
解決的辦法是,使用Linux提供的一種更加高效的通信方式—管道。它可以用來同時連接兩個程序,其中一個程序的輸出將被直接作為另一個程序的輸入,這樣就可以避免使用臨時文件,但編譯時卻需要消耗更多的內(nèi)存。
在編譯過程中使用管道是由GCC的-pipe選項(xiàng)決定的。下面的這條命令就是借助GCC的管道功能來提高編譯速度的:
|
在編譯小型工程時使用管道,編譯時間上的差異可能還不是很明顯,但在源代碼非常多的大型工程中,差異將變得非常明顯。
文件擴(kuò)展名
在使用GCC的過程中,用戶對一些常用的擴(kuò)展名一定要熟悉,并知道其含義。為了方便大家學(xué)習(xí)使用GCC,在此將這些擴(kuò)展名羅列如下:
.c C原始程序;
.C C++原始程序;
.cc C++原始程序;
.cxx C++原始程序;
.m Objective-C原始程序;
.i 已經(jīng)過預(yù)處理的C原始程序;
.ii 已經(jīng)過預(yù)處理之C++原始程序;
.s 組合語言原始程序;
.S 組合語言原始程序;
.h 預(yù)處理文件(標(biāo)頭文件);
.o 目標(biāo)文件;
.a 存檔文件。
GCC常用選項(xiàng)
GCC作為Linux下C/C++重要的編譯環(huán)境,功能強(qiáng)大,編譯選項(xiàng)繁多。為了方便大家日后編譯方便,在此將常用的選項(xiàng)及說明羅列出來如下:
-c 通知GCC取消鏈接步驟,即編譯源碼并在最后生成目標(biāo)文件;
-Dmacro 定義指定的宏,使它能夠通過源碼中的#ifdef進(jìn)行檢驗(yàn);
-E 不經(jīng)過編譯預(yù)處理程序的輸出而輸送至標(biāo)準(zhǔn)輸出;
-g3 獲得有關(guān)調(diào)試程序的詳細(xì)信息,它不能與-o選項(xiàng)聯(lián)合使用;
-Idirectory 在包含文件搜索路徑的起點(diǎn)處添加指定目錄;
-llibrary 提示鏈接程序在創(chuàng)建最終可執(zhí)行文件時包含指定的庫;
-O、-O2、-O3 將優(yōu)化狀態(tài)打開,該選項(xiàng)不能與-g選項(xiàng)聯(lián)合使用;
-S 要求編譯程序生成來自源代碼的匯編程序輸出;
-v 啟動所有警報;
-Wall 在發(fā)生警報時取消編譯操作,即將警報看作是錯誤;
-Werror 在發(fā)生警報時取消編譯操作,即把報警當(dāng)作是錯誤;
-w 禁止所有的報警。
小結(jié)
GCC是在Linux下開發(fā)程序時必須掌握的工具之一。本文對GCC做了一個簡要的介紹,主要講述了如何使用GCC編譯程序、產(chǎn)生警告信息、調(diào)試程序和加快GCC的編譯速度。對所有希望早日跨入Linux開發(fā)者行列的人來說,GCC就是成為一名優(yōu)秀的Linux程序員的起跑線。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=952641