gcc 編譯過程

2021-09-12 21:35:08 字數 2498 閱讀 5422

說實話,很多人做了很久的c/c++,也用了很多ide,但是對於可執行程式的底層生成一片茫然,這無疑是一種悲哀,可以想象到大公司面試正好被問到這樣的問題,有多悲催不言而喻,這裡正由於換工作的緣故,所以打算系統的把之前用到的c/c++補一補。這裡權且當做拋磚引玉,大神飄過。

【總述】

從乙個原始檔(.c)到可執行程式到底經歷了哪幾步,我想大多數的人都知道,到時到底每一步都做了什麼,我估計也沒多少人能夠說得清清楚楚,明明白白。

其實總的流程是這樣的

【第一步】編輯hello.c

【第二步】預處理

預處理過程實質上是處理「#」,將#include包含的標頭檔案直接拷貝到hell.c當中;將#define定義的巨集進行替換,同時將**中沒用的注釋部分刪除等

具體做的事兒如下:

(1)將所有的#define刪除,並且展開所有的巨集定義。說白了就是字元替換

(2)處理所有的條件編譯指令,#ifdef #ifndef #endif等,就是帶#的那些

(3)處理#include,將#include指向的檔案插入到該行處

(4)刪除所有注釋

(5)新增行號和檔案標示,這樣的在除錯和編譯出錯的時候才知道是是哪個檔案的哪一行

(6)保留#pragma編譯器指令,因為編譯器需要使用它們。

gcc -e hello.c -o a.c可以生成預處理後的檔案。通過檢視檔案內容和檔案大小可以得知a.c講stdio.h和stdlib.h包含了進來。

【第三步】編譯

編譯的過程實質上是把高階語言翻譯成機器語言的過程,即對a.c做了這些事兒

(1)詞法分析,

(2)語法分析

(3)語義分析

(4)優化後生成相應的彙編**

從 高階語言->組合語言->機器語言(二進位制)

gcc -s hello.c -o a.s可以生成彙編**

gcc -c hello.c -o a.o將原始檔翻譯成二進位制檔案。類uinx系統編譯的結果生生成.o檔案,windows系統是生成.obj檔案。

編譯的過程就是把hello.c翻譯成二進位制檔案

【第四步】鏈結

就像剛才的hello.c它使用到了c標準庫的東西「printf」,但是編譯過程只是把原始檔翻譯成二進位制而已,這個二進位制還不能直接執行,這個時候就需要做乙個動作,

將翻譯成的二進位制與需要用到庫繫結在一塊。打個比方編譯的過程就向你對你老婆說,我要吃雪糕。你只是給你老婆發出了你要吃雪糕的訴求而已,但是雪糕還沒有到。

gcc hello.c -o a可以生成可執行程式。即gcc不帶任何引數。ldd就可以看到你的可執行程式依賴的庫。

可以看到a.o的大小是1.1k,畢竟他只是把原始檔翻譯成二進位制檔案。a卻有7k,應該是他多了很多「繩子」吧。在執行的時候這些「繩子」就將對應的庫函式「牽過來」。很形象的比喻是不是?哈哈。libc.so.6 中就對咱們用的printf進行了定義。

gcc 的一些命令

gcc的基本用法

linux下c程式設計起步一:掌握gcc基本用法

初學時最好從命令列入手,這樣可以熟悉從編寫程式、編譯、除錯和執行的整個過程。編寫程式可以用vi或其它編輯器編寫。

編譯則使用gcc命令。要往下學習首先就得熟悉gcc命令的用法。

gcc命令提供了非常多的命令選項,但並不是所有都要熟悉,初學時掌握幾個常用的就可以了,到後面再慢慢學習其它選項,免得因選項太多而打擊了學習的信心。

一. 常用編譯命令選項

假設源程式檔名為test.c。

無選項編譯鏈結

用法:#gcc test.c

選項 -o

用法:#gcc test.c -o test

選項 -e

用法:#gcc -e test.c -o test.i

作用:將test.c預處理輸出test.i檔案。

選項 -s

用法:#gcc -s test.i

作用:將預處理輸出檔案test.i彙編成test.s檔案。

選項 -c

用法:#gcc -c test.s

作用:將彙編輸出檔案test.s編譯輸出test.o檔案。

無選項鏈結

用法:#gcc test.o -o test

選項-o

用法:#gcc -o1 test.c -o test

作用:使用編譯優化級別1編譯程式。級別為1~3,級別越大優化效果越好,但編譯時間越長。

gcc編譯過程

本文對gcc編譯器如何工作做乙個概要描述.更為詳細的資訊請參考編譯器手冊。當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。...

gcc編譯過程

當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。gcc將c檔案編譯成彙編檔案。3 彙編。as將彙編檔案編譯成機器碼。4 連...

GCC編譯過程

第一步 預處理後結束 引數 e gcc e hello.c o hello.i 檢視hello.i檔案中的內容 cat hello.i stdio.h的內容插入到檔案裡去了,巨集定義也在預處理中都做了相應的處理 第二步 將hello.i 編譯為 目標 引數 c gcc c hello.i o hel...