gcc編譯流程和 gcc靜態庫和動態庫 二

2021-07-02 14:31:12 字數 1320 閱讀 6072

linux gcc常用命令

1示例程式如下:

複製**

#include

int main(void)

複製**

這個程式,一步到位的編譯指令是:

gcc test.c -o test

實質上,上述編譯過程是分為四個階段進行的,即預處理(也稱預編譯,preprocessing)、編譯(compilation)、彙編 (assembly)和連線(linking)。

22.1預處理

gcc -e test.c -o test.i 或 gcc -e test.c

可以輸出test.i檔案中存放著test.c經預處理之後的**。開啟test.i檔案,看一看,就明白了。後面那條指令,是直接在命令列視窗中輸出預處理後的**.

gcc的-e選項,可以讓編譯器在預處理後停止,並輸出預處理結果。在本例中,預處理結果就是將stdio.h 檔案中的內容插入到test.c中了。

2.2編譯為彙編**(compilation)

預處理之後,可直接對生成的test.i檔案編譯,生成彙編**:

gcc -s test.i -o test.s

gcc的-s選項,表示在程式編譯期間,在生成彙編**後,停止,-o輸出彙編**檔案。

2.3彙編(assembly)

對於上一小節中生成的彙編**檔案test.s,gas彙編器負責將其編譯為目標檔案,如下:

gcc -c test.s -o test.o

2.4連線(linking)

gcc聯結器是gas提供的,負責將程式的目標檔案與所需的所有附加的目標檔案連線起來,最終生成可執行檔案。附加的目標檔案包括靜態連線庫和動態連線庫。

對於上一小節中生成的test.o,將其與c標準輸入輸出庫進行連線,最終生成程式test

gcc test.o -o test

在命令列視窗中,執行./test, 讓它說helloworld吧!3

多個程式檔案的編譯

通常整個程式是由多個原始檔組成的,相應地也就形成了多個編譯單元,使用gcc能夠很好地管理這些編譯單元。假設有乙個由test1.c和 test2.c兩個原始檔組成的程式,為了對它們進行編譯,並最終生成可執行程式test,可以使用下面這條命令:

gcc test1.c test2.c -o test

如果同時處理的檔案不止乙個,gcc仍然會按照預處理、編譯和鏈結的過程依次進行。如果深究起來,上面這條命令大致相當於依次執行如下三條命令:

gcc -c test1.c -o test1.o

gcc -c test2.c -o test2.o

gcc test1.o test2.o -o test

4

GCC執行過程 gcc編譯靜態庫和動態庫

1 預處理階段 這個階段主要是處理原始檔中的 ifdef include和 define命令 命令 gcc e c o i 2 編譯階段 輸入的是中間檔案 i,編譯後生成組合語言檔案 s 命令 gcc s i o s 3 彙編階段 輸入的是彙編檔案 s,輸出的轉換生成的機器語言 o 命令 gcc c...

gcc編譯靜態庫和動態庫

一 動態鏈結庫 1.建立hello.so動態庫 cpp view plain copy print?include voidhello 編譯 gcc fpic shared hello.c o libhello.so include void hello 編譯 gcc fpic shared hel...

GCC編譯過程和動態靜態庫

outline toc 本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll linux上對應的是.a so 編譯過程 之所以成為 靜態庫 是因為在鏈結階段,會將彙編生成的目標檔案.o與...