C 編譯器執行過程

2022-07-29 01:36:09 字數 3089 閱讀 6482

c/c++程式編譯流程:

預處理->編譯->彙編->鏈結

具體的就是:

源**(source coprede)→預處理器(processor)→編譯器(compiler)→匯程式設計序(assembler)→目標程式(object code)→鏈結器(linker)→可執行程式(executables)

c語言在linux下的基本流程如圖:

1. 預處理

預處理相當於根據預處理指令組裝新的c/c++程式。經過預處理,會產生乙個沒有巨集定義,沒有條件編譯指令,沒有特殊符號的輸出檔案,這個檔案的含義同原本的檔案無異,只是內容上有所不同。

①將所有的「#define」刪除,並且展開所有的巨集定義

②處理所有的條件編譯指令,如:「#if」、「#ifdef」、「#elif」、「#else」、「endif」等。這些偽指令的引入使得程式設計師可以通過定義不同的巨集來決定編譯程式對哪些**進行處理。預編譯程式將根據有關的檔案,將那些不必要的**過濾掉。 

③處理「#include」預編譯指令,將被包含的檔案插入到該預編譯指令的位置。

(注意:這個過程可能是遞迴進行的,也就是說被包含的檔案可能還包含其他檔案)

2. 編譯

將預處理完的檔案進行一系列詞法分析、語法分析、語義分析及優化後,產生相應的彙編**檔案。

3. 彙編

將編譯完的彙編**檔案翻譯成機器指令,並生成可重定位目標程式的.o檔案,該檔案為二進位制檔案,位元組編碼是機器指令。

彙編器是將彙編**轉變成機器可以執行的指令,每乙個彙編語句幾乎都對應一條機器指令。所以彙編器的彙編過程相對於編譯器來講比較簡單,它沒有複雜的語法,也沒有語義,也不需要做指令優化,只是根據彙編指令和機器指令的對照表一一翻譯即可。

4. 鏈結

通過鏈結器將乙個個目標檔案(或許還會有庫檔案)鏈結在一起生成乙個完整的可執行程式。

由匯程式設計序生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。

將生成的.obj檔案與庫檔案.lib等檔案鏈結,生成可執行檔案(.exe檔案)

例如,某個原始檔中的函式可能引用了另乙個原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決。

鏈結程式的主要工作就是將有關的目標檔案彼此相連線,也就是將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠被作業系統裝入執行的統一整體。

1.dll .obj .lib使用在windows平台下

2 .so .o .a使用在linux平台下

參考:c/c++程式編譯流程:

預處理->編譯->彙編->鏈結

具體的就是:

源**(source coprede)→預處理器(processor)→編譯器(compiler)→匯程式設計序(assembler)→目標程式(object code)→鏈結器(linker)→可執行程式(executables)

c語言在linux下的基本流程如圖:

1. 預處理

預處理相當於根據預處理指令組裝新的c/c++程式。經過預處理,會產生乙個沒有巨集定義,沒有條件編譯指令,沒有特殊符號的輸出檔案,這個檔案的含義同原本的檔案無異,只是內容上有所不同。

①將所有的「#define」刪除,並且展開所有的巨集定義

②處理所有的條件編譯指令,如:「#if」、「#ifdef」、「#elif」、「#else」、「endif」等。這些偽指令的引入使得程式設計師可以通過定義不同的巨集來決定編譯程式對哪些**進行處理。預編譯程式將根據有關的檔案,將那些不必要的**過濾掉。 

③處理「#include」預編譯指令,將被包含的檔案插入到該預編譯指令的位置。

(注意:這個過程可能是遞迴進行的,也就是說被包含的檔案可能還包含其他檔案)

2. 編譯

將預處理完的檔案進行一系列詞法分析、語法分析、語義分析及優化後,產生相應的彙編**檔案。

3. 彙編

將編譯完的彙編**檔案翻譯成機器指令,並生成可重定位目標程式的.o檔案,該檔案為二進位制檔案,位元組編碼是機器指令。

彙編器是將彙編**轉變成機器可以執行的指令,每乙個彙編語句幾乎都對應一條機器指令。所以彙編器的彙編過程相對於編譯器來講比較簡單,它沒有複雜的語法,也沒有語義,也不需要做指令優化,只是根據彙編指令和機器指令的對照表一一翻譯即可。

4. 鏈結

通過鏈結器將乙個個目標檔案(或許還會有庫檔案)鏈結在一起生成乙個完整的可執行程式。

由匯程式設計序生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。

將生成的.obj檔案與庫檔案.lib等檔案鏈結,生成可執行檔案(.exe檔案)

例如,某個原始檔中的函式可能引用了另乙個原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決。

鏈結程式的主要工作就是將有關的目標檔案彼此相連線,也就是將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠被作業系統裝入執行的統一整體。

1.dll .obj .lib使用在windows平台下

2 .so .o .a使用在linux平台下

參考:

c 編譯器編譯過程

編譯過程 編譯過程分為四步 預處理 編譯 彙編 連線 1.預處理 預處理主要處理原始檔中的 include define 等預處理等命令 預處理主要完成的工作有 參考 程式設計師的自我修養 1 刪除 define,展開巨集 2 處理條件編譯指令。預處理程式先判斷條件,再根據條件修改源 3 刪除注釋 ...

方舟編譯器編譯過程

開發環境推薦ubuntu16.04 sudo apt get y install openjdk 8 jdk git core gnupg flex bison gperf build essential zip curl zlib1g dev libc6 dev i386 lib32ncurses...

編譯器的編譯模板過程

分類 c 模板類 2008 11 05 17 40 4622人閱讀收藏 舉報編譯器 c iostream instantiation linker程式設計 如何組織編寫模板程式 前言常遇到詢問使用模板到底是否容易的問題,我的回答是 模板的使用是容易的,但組織編寫卻不容易 看看我們幾乎每天都能遇到的模...