資源描述:
《轉(zhuǎn)貼:gcc編譯器的常識》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在應用文檔-天天文庫。
1、轉(zhuǎn)貼:GCC編譯器的常識2008-05-0413:15bymoonz-wu,416visits,網(wǎng)摘,收藏,編輯在為Linux開發(fā)應用程序時,絕大多數(shù)情況下使用的都是C語言,因此幾乎每一位Linux程序員面臨的首要問題都是如何靈活運用C編譯器。目前Linux下最常用的C語言編譯器是GCC(GNUCompilerCollection),它是GNU項目中符合ANSIC標準的編譯系統(tǒng),能夠編譯用C、C++和ObjectC等語言編寫的程序。GCC不僅功能非常強大,結(jié)構(gòu)也異常靈活。最值得稱道的一點就是它可以通過不同的前端模塊來支持各種語言,如Java、Fo
2、rtran、Pascal、Modula-3和Ada等。開放、自由和靈活是Linux的魅力所在,而這一點在GCC上的體現(xiàn)就是程序員通過它能夠更好地控制整個編譯過程。在使用GCC編譯程序時,編譯過程可以被細分為四個階段:◆預處理(Pre-Processing)◆編譯(Compiling)◆匯編(Assembling)◆鏈接(Linking)Linux程序員可以根據(jù)自己的需要讓GCC在編譯的任何階段結(jié)束,以便檢查或使用編譯器在該階段的輸出信息,或者對最后生成的二進制文件進行控制,以便通過加入不同數(shù)量和種類的調(diào)試代碼來為今后的調(diào)試做好準備。和其它常用的編
3、譯器一樣,GCC也提供了靈活而強大的代碼優(yōu)化功能,利用它可以生成執(zhí)行效率更高的代碼。GCC提供了30多條警告信息和三個警告級別,使用它們有助于增強程序的穩(wěn)定性和可移植性。此外,GCC還對標準的C和C++語言進行了大量的擴展,提高程序的執(zhí)行效率,有助于編譯器進行代碼優(yōu)化,能夠減輕編程的工作量。GCC起步在學習使用GCC之前,下面的這個例子能夠幫助用戶迅速理解GCC的工作原理,并將其立即運用到實際的項目開發(fā)中去。首先用熟悉的編輯器輸入清單1所示的代碼:清單1:hello.c#includeintmain(void){printf("
4、Helloworld,Linuxprogramming!");???return0;}然后執(zhí)行下面的命令編譯和運行這段程序:#gcchello.c-ohello#./helloHelloworld,Linuxprogramming!從程序員的角度看,只需簡單地執(zhí)行一條GCC命令就可以了,但從編譯器的角度來看,卻需要完成一系列非常繁雜的工作。首先,GCC需要調(diào)用預處理程序cpp,由它負責展開在源文件中定義的宏,并向其中插入“#include”語句所包含的內(nèi)容;接著,GCC會調(diào)用ccl和as將處理后的源代碼編譯成目標代碼;最后,GCC會調(diào)用鏈接程
5、序ld,把生成的目標代碼鏈接成一個可執(zhí)行程序。為了更好地理解GCC的工作過程,可以把上述編譯過程分成幾個步驟單獨進行,并觀察每步的運行結(jié)果。第一步是進行預編譯,使用-E參數(shù)可以讓GCC在預處理結(jié)束后停止編譯過程:#gcc-Ehello.c-ohello.i此時若查看hello.cpp文件中的內(nèi)容,會發(fā)現(xiàn)stdio.h的內(nèi)容確實都插到文件里去了,而其它應當被預處理的宏定義也都做了相應的處理。下一步是將hello.i編譯為目標代碼,這可以通過使用-c參數(shù)來完成:#gcc-chello.i-ohello.oGCC默認將.i文件看成是預處理后的C語言源代
6、碼,因此上述命令將自動跳過預處理步驟而開始執(zhí)行編譯過程,也可以使用-x參數(shù)讓GCC從指定的步驟開始編譯。最后一步是將生成的目標文件鏈接成可執(zhí)行文件:#gcchello.o-ohello在采用模塊化的設計思想進行軟件開發(fā)時,通常整個程序是由多個源文件組成的,相應地也就形成了多個編譯單元,使用GCC能夠很好地管理這些編譯單元。假設有一個由foo1.c和foo2.c兩個源文件組成的程序,為了對它們進行編譯,并最終生成可執(zhí)行程序foo,可以使用下面這條命令:#gccfoo1.cfoo2.c-ofoo如果同時處理的文件不止一個,GCC仍然會按照預處理、編譯
7、和鏈接的過程依次進行。如果深究起來,上面這條命令大致相當于依次執(zhí)行如下三條命令:#gcc-cfoo1.c-ofoo1.o#gcc-cfoo2.c-ofoo2.o#gccfoo1.ofoo2.o-ofoo在編譯一個包含許多源文件的工程時,若只用一條GCC命令來完成編譯是非常浪費時間的。假設項目中有100個源文件需要編譯,并且每個源文件中都包含10000行代碼,如果像上面那樣僅用一條GCC命令來完成編譯工作,那么GCC需要將每個源文件都重新編譯一遍,然后再全部連接起來。很顯然,這樣浪費的時間相當多,尤其是當用戶只是修改了其中某一個文件的時候,完全沒有
8、必要將每個文件都重新編譯一遍,因為很多已經(jīng)生成的目標文件是不會改變的。要解決這個問題,關鍵是要靈活運用GCC,同時還要借助像Make這樣