一 以下是c程式一般的編譯過程:
從圖中看到:
將編寫的乙個c程式(源** )轉換成可以在硬體上執行的程式(可執行** ),需要進行編譯階段 和鏈結這兩個階段。
其中,1. 編譯階段先通過「編譯器 「把乙個.c / .cpp 源** 編譯成 .s的彙編** ;再經過「彙編器 」 把這 個.s的彙編**彙編成 .o 的 目標**
2. 「聯結器 「 通過連線其他 .o **(如果需要的話) 庫檔案 和 1 中的.o 目標**生成可執行檔案
該檔案流被這三種程式(紅色)的加工,分別表現出四種形式(藍色) ,這就是c程式的編譯和鏈結過程。如果再詳細的話,編譯器在將原始檔編譯成彙編檔案的過程又分為:預處理階段(生成 .i**) 和 優化階段
二、c程式設計中的檔案字尾名介紹
.c 未經過預處理的c原始碼
.h c標頭檔案
.i 經過預處理的c原始碼
.s 生成的組合語言**
.o 編譯之後產生的目標檔案
解釋:*.c一般使我們自己編輯的**,使我們勞動的結晶;*.h一般是我們手工生成的介面檔案,如果願意,也可在*.c完成後用gcc的選項-aux-info幫我們生成;*.i是經過預處理後的原始碼,是由gcc在選項-e編譯下自動生成的檔案;*.o是編譯後產生的目標檔案;*.s是gcc在選項-s編譯下生成的組合語言**,對於效能要求很高的程式可以先生成組合語言檔案並對彙編做優化,然後用優化後的彙編生成目標檔案並鏈結
三 演示 hello.c 的編譯 過程(linux 下 gcc)
本小節的演示都針對檔案 hello.c 進行
1. /*
2. * hello.c
3. */
4.5. #include
6. int main()
7.
1.生成預處理後的檔案 hello.i $
gcc -e hello.c -o hello.i
2.生成組合語言檔案 hello.s $
gcc -s hello.i -o hello.s
3.生成目標檔案 hello.o
$ gcc -c hello.i
$ gcc -c hello.s
4. 生成可執行檔案
$ gcc -o hello hello.o
5. 執行及結果 $
./hello
better goal, better life!
當然也可以直接生成, $
gcc -c hello.c 就可以生成可執行檔案。這是gcc內部的事。但就算是跳躍也要經過一步步的翻譯, 原理是相似的,萬變不離其宗!
乙個C 程式的執行過程
可能很多人都知道我們把程式打包成dll就丟出去了,但是裡面的具體的執行過程是怎麼樣的呢。程式集是由元資料和il組成的。il是和cpu無關的語言,是微軟的幾個專家請教了外面的編譯器的作則,開發出來的。il比大多數機器語言都要高階一點。il能夠訪問和操作物件型別,並提高了指令來初始化物件,呼叫物件上的虛...
乙個程式的執行過程
1.資訊在計算機的中表示 我們知道,資訊在計算機中都是用0或 1表示的。計算機通過這些位資訊以及上下文來解讀這些 0 1。也即 計算機中的資訊 位 上下文。我們輸入的hello程式就是由0 1組成的序列,將這些位8位組織成乙個位元組,每個位元組用來表示乙個文字字元。ascii碼給出了一種字元與數字的...
C程式的編譯過程
編譯,編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。c源程式標頭檔案 預編譯處理 cpp 編譯程式本身 優化程式 匯程式設計序 鏈結程式 可執行檔案 1.編譯預處理 ...