gcc編譯器
- GNU CC(簡(jiǎn)稱(chēng)gcc),是GUN項(xiàng)目中符合ANSI C標(biāo)準(zhǔn)的編譯系統(tǒng)。
- GCC不僅僅能支持 C 語(yǔ)言;它現(xiàn)在還支持 Ada 語(yǔ)言、C++ 語(yǔ)言、Java 語(yǔ)言、Objective C 語(yǔ)言、Pascal 語(yǔ)言、COBOL語(yǔ)言,以及支持函數(shù)式編程和邏輯編程的 Mercury 語(yǔ)言,等等。
- 而且gcc是一個(gè)交叉平臺(tái)編譯器,它能夠在當(dāng)前CPU平臺(tái)上為多種不同體系結(jié)構(gòu)的硬件平臺(tái)開(kāi)發(fā)軟件,因此尤其適合在嵌入式領(lǐng)域的開(kāi)發(fā)編譯。
gcc編譯流程分為4個(gè)步驟:- 預(yù)處理(gcc -E)、編譯(gcc -S)、匯編(gcc -c)、鏈接, gcc 選項(xiàng)可以簡(jiǎn)記為“ESc”,相應(yīng)的產(chǎn)出文件的后綴可以簡(jiǎn)記為“iso”
下面具體看一下gcc是如何完成以上4個(gè)步驟的: //test.c #include int main(void) {printf('Hello World!\n');return 0;}
這個(gè)程序,一步到位的編譯指令是: gcc test.c -o test
預(yù)處理運(yùn)行預(yù)處理命令: gcc -E test.c -o test.i 或 gcc -E test.c
gcc的-E選項(xiàng),可以讓編譯器在預(yù)處理后停止,并輸出預(yù)處理結(jié)果。 gcc的-o選項(xiàng),用于輸出處理結(jié)果到文件中。 在本例中,預(yù)處理結(jié)果就是將stdio.h 文件中的內(nèi)容插入到test.c中 了。 編譯預(yù)處理之后,可直接對(duì)生成的test.i文件編譯,生成匯編代碼: gcc -S test.i -o test.s
gcc的-S選項(xiàng),表示在程序編譯期間,在生成匯編代碼后,停止,-o輸出匯編代碼文件。 匯編gcc -c test.s -o test.o
鏈接鏈接階段,這里涉及一個(gè)重要的概念:函數(shù)庫(kù) 在這個(gè)程序中并沒(méi)有定義“printf”的函數(shù)實(shí)現(xiàn),且在預(yù)編譯中包含進(jìn)的“stdio.h”中也只有該函數(shù)的聲明,而沒(méi)有定義函數(shù)的實(shí)現(xiàn),那么,是在哪里實(shí)現(xiàn)“printf”函數(shù)的呢? 最后的答案是:系統(tǒng)把這些函數(shù)的實(shí)現(xiàn)都放到名為libc.so.6的庫(kù)文件中去了,在沒(méi)有特別指定時(shí),gcc會(huì)到系統(tǒng)默認(rèn)的搜索路徑“/usr/lib”下進(jìn)行查找,也就是鏈接到libc.so.6函數(shù)庫(kù)中去,這樣就能調(diào)用函數(shù)“printf”了,而這也正是鏈接的作用
函數(shù)庫(kù)有靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兩種 靜態(tài)庫(kù)是指編譯鏈接時(shí),將庫(kù)文件的代碼全部加入到可執(zhí)行文件中,因此生成的文件比較大,但在運(yùn)行時(shí)也就不再需要庫(kù)文件了,其后綴名通常為“.a”。動(dòng)態(tài)庫(kù)與之相反,在編譯鏈接時(shí)并沒(méi)有將庫(kù)文件的代碼加入到可執(zhí)行文件中,而是在程序執(zhí)行時(shí)加載,這樣可以節(jié)省系統(tǒng)的開(kāi)銷(xiāo)。一般動(dòng)態(tài)庫(kù)的后綴名為“.so”,如前面所述的libc.so.6就是動(dòng)態(tài)庫(kù)。gcc在編譯時(shí)默認(rèn)使用動(dòng)態(tài)庫(kù)。
對(duì)于上一小節(jié)中生成的test.o,將其與C標(biāo)準(zhǔn)輸入輸出庫(kù)進(jìn)行連接,最終生成程序test: gcc test.o -o test
多個(gè)程序文件的編譯通常整個(gè)程序是由多個(gè)源文件組成的,相應(yīng)地也就形成了多個(gè)編譯單元,使用GCC能夠很好地管理這些編譯單元。假設(shè)有一個(gè)由test1.c和 test2.c兩個(gè)源文件組成的程序,為了對(duì)它們進(jìn)行編譯,并最終生成可執(zhí)行程序test,可以使用下面這條命令: gcc test1.c test2.c -o test
如果同時(shí)處理的文件不止一個(gè),GCC仍然會(huì)按照預(yù)處理、編譯和鏈接的過(guò)程依次進(jìn)行。如果深究起來(lái),上面這條命令大致相當(dāng)于依次執(zhí)行如下三條命令: gcc -c test1.c -o test1.ogcc -c test2.c -o test2.ogcc test1.o test2.o -o test
|