一、預熱:
1、gcc是GNU推出的一款基於linux系統的編譯器,gcc可以編譯的程式有:c、c++,組譯工具,
2、在linux系統下,檔案是否可執行不是由檔案名稱尾碼來決定,而是由檔案的屬性(-x)來決定;
3、gcc是通過檔案名稱尾碼來區別輸入檔案的類別,eg:
(1)、“.c” ,C語言,“.i”已經預先處理過的C原始碼檔案
(2)、“.s”,組合語言 ,“.S”經過先行編譯的組合語言原始碼檔案
(3)、“.C、.cc、.cxx”,C++,“.ii”已經與處理過的C++原始碼檔案
(4)、 “.h”,標頭檔
(5)、 “.o”,編譯後的目標檔案,“.a”由目標檔案構成的庫檔案
4、預先處理又叫先行編譯,它的主要工作簡單的說就是“文本替換”,具體的說就是處理以#開頭的命令,(1)宏展開(2)標頭檔包含(3)處理條件編譯
二、 gcc基本用法(gcc的指令選項有100多,慶幸的是我們常用的只有10多個,這裡只列出開發過程中常用的選項):
1、gcc 命令的格式:
gcc [options][filenames] ,
options,編譯選項,
filename,要編譯的檔案名稱,
(ps.[]表示選項可以沒有)
2、options,指令選項:
(1)-o output_filename, 指定編譯後產生的可執行檔的檔案名稱為:output_filename,若不指定,系統預設值為:a.out
(2)-c,告訴編譯器只完成編譯工作不連結成可執行檔,只要產生目標檔案 .o 就可以了,這個命令在應用開發中不常用,主要用在linux 核心編譯工作中。
(3)-g,告訴編譯器,在產生的檔案中注入調試工具(gnu的gdb)需要的符號資訊,要想對編譯出的程式進行調試,就必須加上這個命令(當然,加上這個命令後產生的檔案會變大).
(4)最佳化命令:-O,-O2,這兩個命令都是對程式的編譯、連結進行最佳化處理,提升可執行檔的執行效率,當然相應的編譯時間也會增加,-O2隻是-O的一個進階版本。(在簡單的數學運算例子中,最佳化後執行時間會減少3,4倍)
(5)-Idirname,這裡命令是-I,dirname與I連寫,告訴編譯器,將這裡指定的目錄dirname加入到標頭檔尋找列表中去,(ps.在預先處理階段,對於符號<>,cpp(c pre processor預先處理程式)會根據系統預設設定的標頭檔目錄(/user/include)中尋找,這個選項的作用就是告訴cpp,如果在預設的目錄中找不到標頭檔,就去這裡尋找)
(6)-Ldirname,將dirname指出的目錄加入到庫檔案的目錄列表中,告訴 ld(串連程式)首先到-L指定的目錄中去尋找庫檔案,然後再到系統預設的目錄中去尋找(/usr/lib)
(7)-lname,指定連結時需要的函數庫,eg:當我們的原始碼中用到數學函數,就要連結函數庫libm.a 簡寫m,所以我們可以加上選項 -lm,這樣就連結上了數學庫函數
(8)-staic,採用靜態連結的方式編譯,動態連結通常用 .so 為尾碼,靜態連結用 .o 為尾碼
註:這裡講解下動態連結和動態連結的問題:當採用靜態連結時,連結器會找出所有的庫函數然後把他們的拷貝加入到可執行檔中去(所以,靜態連結產生的檔案會非常的大),靜態連結一旦成功,這個外界的函數庫就不需要了。然而,當採用動態連結時,執行程式只會在程式內做一個標記,指明當程式需要執行時,必須要先將外界的函數庫載入進來,此方式的優點就是會節省空間的,linux下gcc的預設連結方式就是動態連結。
(9)-Wall , (大寫w),列印出所有警告資訊
-w , (小寫w),不列印任何警告資訊
(10)-Dmacro,-D可以再命令中定義一個宏macro,這個選項相當於在程式添加了了 #define macro