乙個C程式的編譯過程(Linux環境下Gcc)

2021-08-08 09:13:55 字數 1295 閱讀 6973

一 以下是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.編譯預處理 ...