C C 從原始碼到可執行程式的過程

2021-08-15 06:59:22 字數 1509 閱讀 2850

1.    預處理

將巨集、條件編譯指令、標頭檔案包含等指令進行展開。也就是說,這是乙個**替換的工作。

c/c++原始碼經預處理後,不再存在各種巨集指令。但展開後依然是**的形式,是人可讀的。

2.    編譯

將c/c++**翻譯成彙編**,然後翻譯成平台的機器**。最終會生成乙個與cpp檔案同名的目標檔案,其字尾名為.o或者.obj。目標檔案以二進位制形式存在。

通常乙個目標檔案有兩個段:

①   **段

②   資料段

這一步工作量最大,也是最耗費時間的一步。

3.    鏈結

將3中生成的目標檔案與各種所需的庫檔案進行鏈結,生成平台可執行檔案。

鏈結器除了將目標檔案與庫檔案進行鏈結,還負責未解決符號的鏈結。未解決符號指extern等關鍵字修飾的符號。

由上可知,由於.h檔案會被多個編譯單元(即.cpp)包含,若.h中有定義,那麼每個包含這個.h檔案的編譯單元都會對同乙個符號進行定義,若該符號為外部鏈結,那麼該定義為所有編譯單元可見,從而會導致duplicatedexternal symbols鏈結錯誤(注意這是個鏈結錯誤)。故若標頭檔案中要進行定義,那麼必須保證定義的符號只有內部鏈結。

c++特點:

對於c++而言,乙個編譯單元指乙個.cpp檔案和它所include的所有.h檔案。     預處理時,.h中的**會替換#include指令,從而擴充到.cpp中。

然後編譯器編譯該.cpp檔案,生成乙個.obj檔案,這就是二進位制的目標檔案。   

當編譯器將所有.cpp都編譯完成後,鏈結器將目標檔案與庫檔案進行鏈結,生成乙個.exe檔案或者庫檔案。

visualstudio的工作:

visualstudio是乙個開發工具集,對於c/c++程式而言,它整合了編譯器和鏈結器。

1.    visualstudio讀取配置,確定標準函式庫與標頭檔案。包括環境變數中的路徑。

2.    visualstudio確定源**之間的依賴關係。

所謂依賴關係,是指b檔案引用了a檔案,那麼就必須先編譯a,再編譯b。故根據依賴關係,編譯器必須滿足:

①   只有a編譯完成後,b的編譯才可以開始

②   當a變化後,b會被重新編譯

實際上,編譯順序被儲存在configure指令碼所生成的makefile檔案中。這就是為什麼編譯時要先執行configure。

可知,確定編譯順序的同時,編譯所用到的標頭檔案也確定了。

3.    visualstudio進行預編譯標頭檔案的編譯

4.    visualstudio進行預處理,替換掉各種巨集命令

5.    visualstudio進行編譯,將原始碼轉換為彙編**,然後轉換為目標**(機器碼)

6.    visualstudio進行鏈結。若為靜態鏈結,將函式庫複製到可執行檔案目錄下;若為動態鏈結,則只在執行時動態呼叫。

注意靜態鏈結複製函式庫這樣的操作需要人為進行,visualstudio無法自動進行。

這就是為什麼需要人為複製庫檔案到生成的可執行目錄下。而且程式的清理等操作也不會影響到可執行目錄下的這些庫檔案。

從原始碼到可執行程式的步驟

編譯,就是把文字形式源 翻譯為機器語言形式的目標檔案的過程。鏈結,是把目標檔案 作業系統的啟動 和用到的庫檔案進行組織,形成最終生成可執行 的過程 編譯過程細分為預編譯 編譯 彙編三個階段 預處理階段,在正式的編譯階段之前進行。主要是以下幾方面的處理 預編譯程式所完成的基本上是對源程式的 替代 工作...

從原始碼到可執行檔案的過程

1.預處理 預處理過程主要是處理那些原始檔和標頭檔案中以 開頭的命令,預處理的規則一般如下 1.對所有的巨集定義進行替換 2.處理所有條件編譯命令 3.處理 include命令,將被包含檔案的內容插入到該命令所在的位置 4.刪除所有的注釋 和 5.新增行號和檔名標識,便於在除錯和出錯時給出具體的 位...

程式從原始碼到可執行檔案

cmake和make ide編輯器 是用於編寫源程式的軟體,通過編輯器來編寫源程式檔案。原始檔有特定的格式,由檔案的字尾名來區分,字尾取決於使用的程式語言,如c語言編寫的是c程式檔案,其原始檔以.c為字尾 c 語言編寫的程式原始檔則以.cpp為字尾。更多時候,編輯器是面向程式設計師的,程式編輯器和普...