編譯的整個過程 預編譯 編譯 彙編 鏈結

2021-08-19 23:00:18 字數 1300 閱讀 2009

編譯分為四個步驟:

每個步驟將檔案編譯成別的格式,如下:

步驟未編譯

預編譯編譯

彙編鏈結

檔案fun.h、fun.cpp、test.cpp

fun.i、test.i

fun.s、test.s

fun.o、test.o

projectname.exe

詳解

1.預編譯

預編譯過程主要做4件事:

①展開標頭檔案

在寫有#include#include "filename"的檔案中,將檔案filename展開,通俗來說就是將fiename檔案中的**寫入到當前檔案中;

②巨集替換

③去掉注釋

④條件編譯

即對#ifndef #define #endif進行判斷檢查,也正是在這一步,#ifndef #define #endif的作用體現出來,即防止標頭檔案被多次重複引用

2.編譯

將**轉成彙編**,並且在這個步驟中做了兩件很重要的工作:

編譯器在每個檔案中儲存乙個函式位址符表,該表中儲存著當前檔案內包含的各個函式的位址

②因為這步要生成彙編**,即一條一條的指令,而呼叫函式的**會被編譯成一條call指令,call指令後面跟的是jmp指令的彙編**位址,而jmp指令後面跟的才是「被呼叫的函式編譯成彙編**後的第一條指令」的位址,但是給call指令後面補充上位址的工作是在鏈結的時候做的事情。

3.彙編

將彙編**轉成機器碼

4.鏈結

編譯器將生產的多個.o檔案鏈結到一起生成乙個可執行.exe檔案;

但是在這個過程中,編譯器做的乙個重要的事情是將每個檔案中call指令後面的位址補充上;方式是從當前檔案的函式位址符表中開始找,如果沒有,繼續向別的檔案的函式位址符表中找,找到後填補在call指令後面,如果找不到,則鏈結失敗。

預編譯 編譯 彙編 鏈結過程

將源 或者標頭檔案經過預編譯成乙個.i檔案。例如c 副檔名是.cpp,標頭檔案的副檔名可能是.hpp,預編譯後的副檔名是.i 預編譯的過程相當於下面的命令 對c語言檔案的處理 gcc e 原始檔 o目標檔案 對c 語言的檔案的處理 g gcc e 原始檔 o目標檔案 例如 gcc e hello.c...

預編譯,編譯,彙編,鏈結

2.編譯的工作內容 3.彙編的工作內容 4.鏈結器的工作內容 參考 include int main 使用gcc編譯器 gcc hello.c a.out a.out 含義是 assembler output 即 彙編輸出 上述過程可以分解為四個步驟 1.預處理 prepressing gcc e ...

Linux 預編譯 編譯 彙編 鏈結過程

當我們拿到乙個.cpp的檔案,我們看到它的 但我們又是知道它是怎樣執行的?我們都知道我們所看到的 都是高階語言。但計算機底層只能識別像0,1這樣的低階語言,所以這也是乙個將c c 轉成組合語言然後再變成機器語言的過程。具體可分為預編譯 編譯 彙編 鏈結四個過程。一 在liunx中這四個階段的具體命令...