c語言的編譯鏈結過程要把我們編寫的乙個c程式(源**)轉換成可以在硬體上執行的程式(可執行**),需要進行編譯和鏈結。編譯就是把文字形式源**翻譯為機器語言形式的目標檔案的過程。鏈結是把目標檔案、作業系統的啟動**和用到的庫檔案進行組織形成最終生成可載入、可執行**的過程。
將乙個.c檔案編譯鏈結成.exe檔案,需要以下幾個步驟:預處理、編譯、彙編、鏈結
預處理器:將.c 檔案轉化成 .i檔案,使用的gcc命令是:gcc –e,對應於預處理命令cpp;
編譯器:將.c/.h檔案轉換成.s檔案,使用的gcc命令是:gcc –s,對應於編譯命令 cc –s;
彙編器:將.s 檔案轉化成 .o檔案,使用的gcc 命令是:gcc –c,對應於彙編命令是 as;
鏈結器:將.o檔案轉化成可執行程式,使用的gcc 命令是: gcc,對應於鏈結命令是 ld;
載入器:將可執行程式載入到記憶體並進行執行,loader和ld-linux.so。
預處理:主要是做一些**文字的替換工作。(該替換是乙個遞迴逐層展開
的過程。)
(1)將所有的#define刪除,並展開所有的巨集定義
(2)處理所有的條件預編譯指令,如:#if #ifdef #elif #else #endif
(3)處理#include預編譯指令,將被包含的檔案插進到該指令的位置,這個過程是遞迴的
(4)刪除所有的注釋//與/* */
(5)新增行號與檔名標識,以便產生除錯用的行號資訊以及編譯錯誤或警告時能夠顯示行號
(6)保留所有的#pragma編譯器指令,因為編譯器需要使用它們
編譯:把預處理完的檔案進行一系列
詞法分析
(lex
)、語法分析
(yacc
)、語義分析及優化
後生成彙編**,這個過程是程式構建的核心部分。
彙編:彙編**->機器指令。
鏈結:這裡講的鏈結,嚴格說應該叫靜態鏈結。多個目標檔案、庫->最終的可執行檔案(拼合的過程)。
程式編譯,鏈結過程
c語言的編譯鏈結過程要把我們編寫的乙個c程式 源 轉換成可以在硬體上執行的程式 可執行 需要進行編譯和鏈結。編譯就是把文字形式源 翻譯為機器語言形式的目標檔案的過程。鏈結是把目標檔案 作業系統的啟動 和用到的庫檔案進行組織形成最終生成可載入 可執行 的過程。過程 如下 預處理器 將.c 檔案轉化成 ...
程式的編譯鏈結過程
一段源 到可執行性程式需要經歷預處理 編譯彙編和鏈結等步驟,接下來詳細介紹這些過程 假設檔案main.czhong有如下 include int main 1 巨集定義指令 2 條件編譯 3 標頭檔案包含指令 4 特殊符號處理 不能在標頭檔案中定義全域性變數,因為在標頭檔案中定義全域性變數將會使所有...
C程式的編譯鏈結過程
程式由原始檔編譯得到可執行檔案看起來好像是很簡單的過程,windows的ide環境下,點一下bulid就可以生成可執行檔案,在linux環境下,gcc編譯器也提供了很多選項可以很方便的從原始檔生成可執行檔案。事實上程式的編譯和鏈結是乙個非常複雜的過程,ide幫我們隱藏了大量的細節。下面我們以最經典的...