本節書摘來自異步社群《linux c程式設計從入門到精通》一書中的第2章,第2.2節,作者 宋磊 , 程鋼,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
linux c程式設計從入門到精通
gcc(gnu c compiler)是gnu推出的功能強大、性能優越的多平台編譯器,使用gcc可以編譯c和c++源代碼,編譯出的目标代碼品質非常好,編譯速度也很快。本節主要讨論gcc的安裝與使用方法。
在ubuntu12.04中,gcc是已安裝好的,但是其還缺少常用的頭檔案和庫檔案,是以還需要安裝build-essential這個包,可以在聯網狀态下使用如下指令來安裝這個包。
其中,apt-get是ubuntu中的軟體管理指令,它可以安裝、删除、更新系統中的軟體包。install是安裝軟體包,build-essential是待安裝的軟體包名稱。由于安裝軟體需要root權限,是以系統會提示輸入密碼。在輸入密碼後,系統會自動安裝編譯所需要的相關檔案。系統在安裝build-essential時,會把程式檔案放入以下幾個目錄。
/usr/lib。大部分的編譯程式放在這個目錄。在這裡由編譯時需要的可執行程式,還有一些特定版本的庫檔案與頭檔案等。
/usr/bin/gcc。指的是編譯程式,即實際在指令行中執行的程式。這個目錄可供各個版本的gcc使用,隻要用不同的編譯程式目錄來安裝就可以。
/usr/include。這個目錄及其子目錄中包含程式所需要的頭檔案。缺少頭檔案,gcc在編譯時會出現找不到頭檔案的錯誤。
在安裝完成之後,可以使用“gcc-v”指令來檢視gcc的版本号。
gcc對c語言的處理需要經過如下4個步驟。
預處理。這—步需要分析各種指令,如#define、#include、#if等。gcc調用cpp程式來進行預處理工作。
編譯。這一階段根據輸入檔案産生彙編語言。由于通常是立即調用彙程式設計式,是以其輸出一般不儲存在檔案中。gcc調用ccl進行編譯工作。
彙編。這一步将彙編語言用作輸入,産生具有.o擴充名的目标檔案。gcc調用as進行彙編工作。
連結。這一階段中,各目标檔案被放在可執行檔案的适當位置上,該程式引用的函數也放在可執行檔案中(對使用共享庫的程式稍有不同)。gcc調用連結程式1d來完成最終的任務。
和大多數shell指令一樣,gcc的基本使用方式如下。
gcc可以通過選項對程式的生成進行全面控制,每個選項可以有多種取值,在此隻對其中常用部分進行介紹,其餘的參數可以參考gcc手冊或其他專門資料。gcc的常用選項如表2.1所示。

gcc的指令選項可以組合使用,不過在使用時,每個指令選項都要有一個自己的連字元“-”。如果采用簡寫的方式,很可能使指令的含義完全不同。
在linux下生成的可執行檔案沒有固定的擴充名。任何符合linux要求的檔案名,隻要檔案的通路屬性中有可以執行的屬性,該檔案就是可以執行的。是以,在使用上面介紹的-o filename參數時,如果是生成連結後的可執行檔案,filename變量可以取任意一個符合linux要求的檔案名。
gcc指令中的第2部分是一個輸入給gcc指令的檔案。gcc按照指令選項的要求對輸入檔案進行處理,形成結果輸出檔案。輸入的檔案不一定是c的源代碼檔案,還可能是預處理檔案、目标檔案等。如何确定輸入檔案的類型,gcc是通過輸入檔案的擴充名來确定的。表2.2是gcc與c相關的輸入檔案擴充名命名規範。
【例2.1】gcc編譯器應用執行個體1。
【例2.1】是使用gcc來對一個c語言檔案進行編譯的應用執行個體,這個c語言檔案被命名為examhello.c,使用cat指令可以檢視該檔案的内容:
此時可以使用gcc指令對這個檔案進行編譯,然後運作。
在實際的開發過程中經常遇到應用代碼比較複雜的情況,此時通常采用将主函數和其他函數放在不同檔案中的方法。除了主程式之外,每個函數都由函數聲明(函數頭)和函數實作(函數體)兩部分組成。函數的聲明一般放在頭檔案(.h)中,而函數的定義檔案放在實作檔案中(.c)。gcc可以很容易地把多個源檔案編譯成目标代碼并連結起來,如【例2.2】所示。
【例2.2】gcc編譯器應用執行個體2。
這是使用另外一個c語言檔案來存放輸出函數的執行個體,在目前工作目錄下建立一個c語言檔案,其内容如下。
然後建立一個.h頭檔案,其内容如下。
可以使用如下的指令來對這兩個c語言檔案進行編譯。