日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

gcc編譯器

 袁先森lemon 2019-04-15

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多