linux應用程式設計--GCC程式編譯
GCC程式編譯
linux系統下的GCC(GNU C Compiler)是GNU推出的功能強大、效能優越的多平臺編譯器,是GNU的代表作之一。GCC可以在多種硬體平臺上編譯出可執行程式,其執行效率與一般的編譯器相比,平均效率要高20%~30%。
GCC編譯程式的四個階段
- 預處理(Pre-Processing):編譯器將C程式的標頭檔案編譯進來,還有完成巨集的替換。
- 編譯(Compiling):這個階段編譯器主要做詞法分析、語法分析、語義分析等,在檢查無誤後,將程式編譯成組合語言。
- 彙編(Assembling):將彙編程式翻譯成機器語言,也就是二進位制程式。
- 連結(Linking):連結標頭檔案中的函式所對應的函式庫。例如:printf函式在stdio.h標頭檔案中只是完成宣告,要實現printf函式的功能,還需要連結到實際實現程式碼中去。
GCC通過後綴來區分輸入檔案的類別
.c |
C語言原始碼檔案 |
.a |
是由目標檔案構成的庫檔案 |
.C,.cc或.cxx |
C++原始碼檔案 |
.h |
標頭檔案 |
.i |
已預處理過的C原始碼檔案 |
.ii |
已預處理過的C++原始碼檔案 |
.o |
編譯後的目標檔案 |
.s |
組合語言原始碼檔案 |
.S |
經過預編譯的組合語言原始碼檔案 |
GCC用法
gcc [options] [filenames]
options : 編譯器所需要的編譯選項
filenames : 要編譯的檔名
編譯選項
-o output_filename : 確定可執行檔案的名稱,如果不新增該選項,則給出預設執行檔案xxx.out
-c : 只編譯,不連結成為可執行檔案,生成.o目標檔案
-g : 產生除錯工具(GNU的GDB)所必要的除錯資訊
-O : 對程式進行優化編譯、連結,產生的可執行檔案的執行效率可以提高,但是編譯、連結速度會降低
-O2 : 比-O更好的優化編譯、連結
-I dirname : 將dirname所指出的目錄加入到程式標頭檔案目錄列表中
C程式中的標頭檔案包含兩種情況:
#include <A.h>
#include "B.h"
對於<>,預處理程式cpp在系統預設的標頭檔案目錄中搜尋相應的檔案
對於"",cpp在當前目錄中搜尋標頭檔案,如果新增-I選項,並且在當前目錄中沒有找到需要的檔案,就到指定的dirname目錄中去尋找。
-L dirname : 將dirname所指定的目錄加入到庫檔案的目錄列表中。在預設情況下,連線程式ld在系統的預設路徑中(/user/lib)尋找所需要的庫檔案,這個選項告訴連結程式,首先到-L指定的目錄中去尋找,然後再到系統預設路徑中尋找。
-lname : 在連線時,裝載名字為libname.a的函式庫,該函式庫的目錄可以是系統預設或者由-L選項指定。
-static : 靜態連結庫檔案。當使用靜態庫時,連結器找出程式所需的函式,然後將它們拷貝到可執行檔案中,此後將不需要靜態程式庫,但是靜態連結佔用空間大,所以linux下進行連結的預設操作是連結動態庫。
-Wall : 生成所有警告資訊
-w : 不生成任何警告資訊
-DMACRO : 定義MACRO巨集,等效於在程式中使用#define MACRO