本次講解基於c++,在ubuntu下編譯一段例項**,詳細講解gcc的編譯過程。
通過本教程,你將掌握linux下gcc編譯過程和原理。
詳見我的部落格:
linux下c/c++編譯原理及過程:
/*!
** \file main.c
* \brief 測試
** \author zyf
* \date 2020/12/09 23:28:20
* \version 1.0.0
*/#include
#define max 500
#define min 20
#define _debug
#define setbit(x) (1
main
(int argc,
char
* ar**)
zhangyanfeng@ubuntu:/mnt/hgfs/linux/gcc$ ls
zhangyanfeng@ubuntu:/mnt/hgfs/linux/gcc$ vim main.c
zhangyanfeng@ubuntu:/mnt/hgfs/linux/gcc$ ls
main.c
zhangyanfeng@ubuntu:/mnt/hgfs/linux/gcc$ cat main.c
/*!*
* \file main.c
* \brief 測試
** \author zyf
* \date 2020/12/09 23:28:20
* \version 1.0.0*/
#include
#define max 500
#define min 20
#define _debug
#define setbit(x) (1
zhangyanfeng@ubuntu:/mnt/hgfs/linux/gcc$
將要包含(include)的檔案插入原檔案中、將巨集定義展開、根據條件編譯命令選擇要使用的**,最後將這些**輸出到乙個「.i」檔案中等待進一步處理。
編譯就是把c/c++**(比如上面的".i"檔案)「翻譯」成彙編**,即將相應的高階語言**對映到組合語言,處理define,include等命令,載入外部的**。
將組合語言對映到機器碼,即彙編就是將第二步輸出的彙編**翻譯成符合一定格式的機器**,在linux系統上一般表現位elf目標檔案(obj檔案)。
將彙編生成的obj檔案、系統庫的obj檔案、庫檔案鏈結起來,最終生成可以在特定平台執行的可執行程式。
動態鏈結使用動態鏈結庫進行鏈結,生成的程式在執行的時候需要載入所需的動態庫才能執行。 動態鏈結生成的程式體積較小,但是必須依賴所需的動態庫,否則無法執行。
靜態鏈結使用靜態庫進行鏈結,生成的程式包含程式執行所需要的全部庫,可以直接執行,不過靜態鏈結生成的程式體積較大。
不鏈結系統標準啟動檔案和標準庫檔案。
gcc -v -nostdlib -o zyftest_nostdlib zyftest.o
3.4.3.2、nostartfiles
不鏈結系統標準啟動檔案,而標準庫檔案仍然正常使用。
gcc -v -nostartfiles -o zyftest_nostartfiles zyftest.o
gcc編譯過程
本文對gcc編譯器如何工作做乙個概要描述.更為詳細的資訊請參考編譯器手冊。當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。...
gcc編譯過程
當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。gcc將c檔案編譯成彙編檔案。3 彙編。as將彙編檔案編譯成機器碼。4 連...
GCC編譯過程
第一步 預處理後結束 引數 e gcc e hello.c o hello.i 檢視hello.i檔案中的內容 cat hello.i stdio.h的內容插入到檔案裡去了,巨集定義也在預處理中都做了相應的處理 第二步 將hello.i 編譯為 目標 引數 c gcc c hello.i o hel...