C C 程式編譯的四個過程

2022-09-23 07:36:11 字數 1396 閱讀 4280

g++是linux下c++的編譯器;我為什麼會選擇linux下的g++編譯器,就是因為g++可以看到程式從編譯到執行的過程做了些什麼。而vs等整合開發環境看不到這些,並不是說vs工具不好,(vs還是相當好用的...)。對於學習來說,需要知道程式從編譯到執行進行了哪些工作,做了哪些事情,首推g++編譯器(這個看個人習慣)。

一、常見檔案字尾

.c為字尾的檔案:c語言源**檔案

.a為字尾的檔案:是由目標檔案構成的庫檔案

.c,.cc為字尾的檔案:是c++源**檔案

.h為字尾的檔案:標頭檔案

o為字尾的檔案:是編譯後的目標檔案

.s為字尾的檔案:是組合語言源**檔案

.m為字尾的檔案:objective-c原始程式

.so為字尾的檔案:編譯後的動態庫檔案

二、g++執行的四個過程

1、預處理:條件編譯,標頭檔案包含,巨集替換的處理,生成.i檔案。

2、編譯:將預處理後的檔案轉換成組合語言,生成.s檔案

3、彙編:彙編變為目標**(機器**)生成.o的檔案

4、鏈結:連線目標**,生成可執行程式

三、最簡單的c++程式——"helloworld!\n"

// 新建hello.cpp檔案,vim編輯

#include

using namespace std;

int main(void)

(1)預處理階段

g++ -e hello.cpp > hello.i通過vim開啟hello.i檔案,你會發現一些情況(最好是自己觀察,看看哪些內容被換了);

巨集的替換,還有注釋的消除,還有找到相關的庫檔案,將#include檔案的全部內容插入。若用<>括起檔案則在系統的include目錄中尋找檔案,若用""括起檔案則在當前目錄中尋找檔案。

用編輯器開啟hello.i會發現有很多很多**,你只需要看最後部分就會發現,預處理做了巨集的替換,還有注釋的消除,可以理解為無關**的清除。

(2)編譯

g++ -s hello.cpp生成hello.s檔案,.s檔案表示是彙編檔案,用編輯器開啟就都是彙編指令。(可以通過vim編輯器看看hello.s裡面的內容【都是彙編指令,哈哈】)。

(3)彙編

g++ -c hello.cpp彙編變為目標**(機器**)生成.o的檔案,.o是gcc生成的目標檔案,用編輯器開啟就都是二進位制機器碼。

(4)鏈結 ——鏈結生成可執行檔案(庫檔案進行鏈結)

g++ -o hello hello.cpp程式執行:./hello【輸出hello world!】

可以重新檢視這個小程式,在這個程式中並沒有定義」cout」的函式(準確說cout不是函式,cout卻很獨特:既不是函式,似乎也不是c++特別規定出來的像if,for一類有特殊語法的「語句」,其實說到底還是函式呼叫,不過這函式有些特殊,用的是運算子過載,確切地說是過載了「<

程式編譯的四個過程

hello.c 源程式 是一條高階c語言程式,雖然它是以一種易讀的形式,讓人們容易理解。但是,它卻無法直接驅動硬體cpu直接執行。為了我們編寫的hello.c程式可以被執行,驅動硬體電路工作,hello.c程式必須經過一些列處理步驟,將源程式轉化為可執行性的目標程式。而我們知道,機器語言就是處理器可...

linux 編譯程式的四個過程

linux 編譯程式的過程與c c 程式編譯過程類似,只是使用的命令或實現的方法不一樣 環境平台不一樣 但是總體框架一樣。一 預編譯 命令是gcc e main.c o main.o 假設當前要編譯的檔案是main.c 1 將所有的 define刪除,並展開所有的巨集定義 2 處理所有的預編譯指令,...

linux 編譯程式的四個過程

一 預編譯 他的命令是gcc e main.c o main.o 假設當前要編譯的檔案是main.c 1.將所有的 define刪除,並展開所有的巨集定義 2.處理所有的預編譯指令,例如 if,elif,else,endif 3.處理 include預編譯指令,將被包含的檔案插入到預編譯指令的位置 ...