GCC的編譯過程和鏈接


GCC編譯過程

  • 一個C/C++文件要經過預處理(preprocessing)、編譯(compilation)、匯編(assembly)、和連接(linking)才能變成可執行文件。

504ba0de-6705-45b6-b029-5d426b7e5b06

gcc的常用選項

-E 只預處理,不會編譯、匯編、鏈接

-S 編譯到匯編語言不進行匯編和鏈接 

-c 編譯和匯編,不會鏈接

-o 指定輸出文件名為file,這個名稱不能跟源文件名同名

-static 此選項對生成的文件采用靜態鏈接 

-g 生成調試信息,GNU調試器可利用該信息。

-share 此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫.

-O0

-O1

-O2

-O3 編譯器的優化選項的4個級別,-O0表示沒有優化-O1為缺省值,-O3優化級別最高 

-w 不生成任何警告信息。

-Wall 生成所有警告信息.

以hello.c為例:

#include <stdio.h>
#define   MAX  20 
#define   MIN  10 
#define  _DEBUG
#define   SetBit(x)  (1<<x) 

int main(int argc, char* argv[])
{
    printf("Hello World \n");
    printf("MAX = %d,MIN = %d,MAX + MIN = %d\n",MAX,MIN,MAX + MIN); 
#ifdef _DEBUG
    printf("SetBit(5) = %d,SetBit(6) = %d\n",SetBit(5),SetBit(6));
    printf("SetBit( SetBit(2) ) = %d\n",SetBit( SetBit(2) ));        
#endif
    return 0;
}

預處理

  • 預處理就是將要包含(include)的文件插入原文件中、將宏定義展開、根據條件編譯命令選擇要使用的代碼,最后將這些代碼輸出到一個“.i”文件中等待進一步處理。

命令為:

gcc -E -o hello.i hello.c

a324486a-cb17-423e-8f1a-884ed449109d

編譯

  • 編譯就是把C/C++代碼(比如上面的".i"文件)“翻譯”成匯編代碼。

命令是:

gcc -S -o hello.s hello.i

d1db4031-01b8-46cd-9fef-fcc507aac2cd

匯編

  • 匯編就是將第二步輸出的匯編代碼翻譯成符合一定格式的機器代碼,在Linux系統上一般表現位ELF目標文件(OBJ文件)。

673c56b8-b8be-4ef2-a6c5-99f1acb66777

命令是:

gcc -c -o hello.o hello.s

鏈接

  • 鏈接就是將匯編生成的OBJ文件、系統庫的OBJ文件、庫文件鏈接起來,最終生成可以在特定平台運行的可執行程序。

03aba40f-defd-4055-9cde-ccd0454315d5

命令是:

gcc -o hello hello.o

總結

在編譯過程中。除非使用了"-c",“-S”,或"-E"選項(或者編譯錯誤阻止了完整的過程),否則統一完整鏈接步驟。

譬如:gcc hello.c 和gcc -o hello hello.c都已經完成鏈接操作。

90f9f1a2-39d1-46a2-b202-0bb41b5f1cf4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM