天天看點

gcc編譯過程介紹

作者:嵌入式老林

gcc編譯器的安裝

工作中,在Linux環境下,有過量産項目的公司,gcc一般都是已經安裝好了的。如果需要安裝,請從官網下載下傳安裝或網上找資源下載下傳

gcc官網:GCC, the GNU Compiler Collection- GNU Project

gcc編譯過程介紹

此處不贅述安裝過程了

檢視是否安裝成功:gcc -v 能查到gcc版本号,說明安裝成功

gcc編譯過程介紹

編譯過程介紹:

最開始學習程式設計的時候,一般都是用IDE去編譯的,不管是IDE還是gcc編譯的時候都會有四個過程

一個編譯過程一般要經過四個過程:

預處理------編譯------彙編------連結

gcc編譯過程介紹

預處理:展開頭檔案/宏替換/去掉注釋/條件編譯

編譯:檢查文法,生成彙編代碼

彙編:彙編代碼轉換機器碼,但還不可執行

連結:将要用到的庫連結到一起生成可執行程式

gcc首先調用cpp進行預處理,在預處理過程中,對源代碼檔案中的檔案包含(include)、預編譯語句(如宏定義define等)進行分析。接着調用cc1進行編譯,這個階段将預處理得到的源代碼檔案,進行“翻譯轉換”,産生出機器語言的目标程式,得到機器語言的彙編檔案。彙編過程是針對彙編語言的步驟,調用as進行工作,一般來講,.S為字尾的彙編語言源代碼檔案和彙編、.s為字尾的彙編語言檔案經過預編譯和彙編之後都生成以.o為字尾的目标檔案。當所有的目标檔案都生成之後,gcc就調用ld來完成最後的關鍵性工作,這個階段就是連結。在連結階段,所有的目标檔案被安排在可執行程式中的恰當的位置,同時,該程式所調用到的庫函數也從各自所在的庫中鍊到合适的地方。

gcc的使用:

簡單使用

指令格式:gcc [選項] [檔案名]

以編譯單個檔案為例,最簡單的使用方法:

gcc test.c //預設生成可執行檔案的名字為a.out

gcc編譯過程介紹

指定可執行檔案的名字:gcc –o test test.c //指定生成可執行檔案的名字為test

gcc編譯經曆的四個過程:

(1)預處理: gcc -E test.c -o test.i//生成預編譯檔案

(2)編譯: gcc -S test.i -o test.s//生成彙編代碼

(3)彙編: gcc -c test.s -o test.o (或as test.s -o test.o ) //生成目标檔案

(4)連結: gcc -o test test.o//連結,生成可執行檔案

gcc常用選項

選項 含義
-E 隻預編譯,不做任何處理
-c 隻編譯不連結,生成目标檔案”.o”
-S 隻編譯不會彙編,生成彙編代碼”.s”
-g 在執行過程中包含标準調試資訊
-o file 指定将file檔案作為輸出檔案
-v 列印出編譯器内部編譯各過程的指令行資訊和編譯器的版本
-I dir 在頭檔案的搜尋路徑清單中添加dir目錄

gcc支援的字尾名

字尾名 所對應的語言
.c C原始程式
.C/.cc/.cxx C++原始程式
.m Objective.c原始程式
.i 已經預處理的C原始程式
.ii 已經預處理的C++原始程式
.s/.S 彙編語言原始程式
.h 預處理檔案(頭檔案)
.o 目标檔案

靜态庫和動态庫

連結可分為動态連結和靜态連結:

靜态庫是指編譯連結時,把庫檔案的代碼全部加入到可執行檔案中,是以生成的檔案比較大,但在運作時也就不再需要庫檔案了。其字尾名一般為 “.a”。

動态庫與之相反,在編譯連結時并沒有把庫檔案的代碼加入到可執行檔案中,而是在程式執行時由運作時連結檔案加載庫,這樣可以節省系統的開銷。動态庫一般字尾名為“.so”。

gcc在編譯時預設使用動态庫連結,加上-static 參數則采用靜态連結。

gcc test.o -static -o test_static

可看對外連結接靜态庫和動态庫,最終生成的可執行檔案大小相差很多

gcc編譯過程介紹

繼續閱讀