編譯分為四個步驟:
每個步驟將檔案編譯成別的格式,如下:
步驟未編譯
預編譯編譯
彙編鏈結
檔案fun.h、fun.cpp、test.cpp
fun.i、test.i
fun.s、test.s
fun.o、test.o
projectname.exe
詳解
:
1.預編譯:
預編譯過程主要做4件事:2.編譯①展開標頭檔案
在寫有
#include
或#include "filename"
的檔案中,將檔案filename展開,通俗來說就是將fiename檔案中的**寫入到當前檔案中;②巨集替換
③去掉注釋
④條件編譯
即對
#ifndef #define #endif
進行判斷檢查,也正是在這一步,#ifndef #define #endif
的作用體現出來,即防止標頭檔案被多次重複引用
將**轉成彙編**,並且在這個步驟中做了兩件很重要的工作:3.彙編①編譯器在每個檔案中儲存乙個函式位址符表,該表中儲存著當前檔案內包含的各個函式的位址;
②因為這步要生成彙編**,即一條一條的指令,而呼叫函式的**會被編譯成一條call指令,call指令後面跟的是jmp指令的彙編**位址,而jmp指令後面跟的才是「被呼叫的函式編譯成彙編**後的第一條指令」的位址,但是給call指令後面補充上位址的工作是在鏈結的時候做的事情。
將彙編**轉成機器碼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中這四個階段的具體命令...