Linux下gcc編譯過程例項講解

2021-10-11 18:11:54 字數 2598 閱讀 9471

本次講解基於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...