gcc編譯器的安裝
工作中,在Linux環境下,有過量産項目的公司,gcc一般都是已經安裝好了的。如果需要安裝,請從官網下載下傳安裝或網上找資源下載下傳
gcc官網:GCC, the GNU Compiler Collection- GNU Project
此處不贅述安裝過程了
檢視是否安裝成功:gcc -v 能查到gcc版本号,說明安裝成功
編譯過程介紹:
最開始學習程式設計的時候,一般都是用IDE去編譯的,不管是IDE還是gcc編譯的時候都會有四個過程
一個編譯過程一般要經過四個過程:
預處理------編譯------彙編------連結
預處理:展開頭檔案/宏替換/去掉注釋/條件編譯
編譯:檢查文法,生成彙編代碼
彙編:彙編代碼轉換機器碼,但還不可執行
連結:将要用到的庫連結到一起生成可執行程式
gcc首先調用cpp進行預處理,在預處理過程中,對源代碼檔案中的檔案包含(include)、預編譯語句(如宏定義define等)進行分析。接着調用cc1進行編譯,這個階段将預處理得到的源代碼檔案,進行“翻譯轉換”,産生出機器語言的目标程式,得到機器語言的彙編檔案。彙編過程是針對彙編語言的步驟,調用as進行工作,一般來講,.S為字尾的彙編語言源代碼檔案和彙編、.s為字尾的彙編語言檔案經過預編譯和彙編之後都生成以.o為字尾的目标檔案。當所有的目标檔案都生成之後,gcc就調用ld來完成最後的關鍵性工作,這個階段就是連結。在連結階段,所有的目标檔案被安排在可執行程式中的恰當的位置,同時,該程式所調用到的庫函數也從各自所在的庫中鍊到合适的地方。
gcc的使用:
簡單使用
指令格式:gcc [選項] [檔案名]
以編譯單個檔案為例,最簡單的使用方法:
gcc test.c //預設生成可執行檔案的名字為a.out
指定可執行檔案的名字: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
可看對外連結接靜态庫和動态庫,最終生成的可執行檔案大小相差很多