歡迎大家閱讀參考,如有錯誤或疑問請留言糾正,謝謝
一、什麼是gcc 1、gcc(GNUC Compiler)編譯器的作者是RichardStallman,也是GNU項目的奠基者。 2、什麼是gcc:gcc是GNUCompiler Collection的縮寫。最初是作為C語言的編譯器(GNUC Compiler),現在已經支持多種語言了,如C、C++、Java、Pascal、Ada、COBOL語言等。 3、gcc支持多種硬件平台,甚至對DonKnuth 設計的 MMIX 這類不常見的計算機都提供了完善的支持
二、gcc特點 1、gcc是一個可移植的編譯器,支持多種硬件平台 2、gcc不僅僅是個本地編譯器,它還能跨平台交叉編譯。 3、gcc有多種語言前端,用於解析不同的語言。 4、gcc是按模塊化設計的,可以加入新語言和新CPU架構的支持 5、gcc是自由軟件
三、gcc編譯過程 1、預處理(Pre-Processing) 2、編譯(Compiling):生成匯編程序 3、匯編(Assembling):將匯編程序生成二進制目標程序 4、鏈接(Linking)
5、gcc編譯程序過程示意圖
hello程序是一個高級C語言程序,這種形式容易被人讀懂。為了在系統上運行hello.c程序,每條C語句都必須轉化為低級機器指令。然後將這些指令打包成可執行目標文件格式,並以二進制形式存儲器於磁盤中。
四、gcc常用選項
選項名
作用
-o
產生目標(.i、.s、.o、可執行文件等)
-c
通知gcc取消鏈接步驟,即編譯源碼並在最後生成目標文件
-E
只運行C預編譯器
-S
告訴編譯器產生匯編語言文件後停止編譯,產生的匯編語言文件擴展名為.s
-Wall
使gcc對源文件的代碼有問題的地方發出警告
-Idir
將dir目錄加入搜索頭文件的目錄路徑
-Ldir
將dir目錄加入搜索庫的目錄路徑
-llib
鏈接lib庫
-g
在目標文件中嵌入調試信息,以便gdb之類的調試程序調試
1、gcc示例 (1)、gcc -E hello.c -o hello.i(預處理) (2)、gcc -S hello.i -o hello.s(編譯) (3)、gcc -c hello.s -o hello.o(匯編,生成可重定位目標文件) (4)、gcc hello.o -o hello(鏈接,成可執行目標文件) (5)、gcc hello.c -o hello(直接編譯鏈接成可執行目標文件) (6)、gcc -c hello.c或gcc -c hello.c -o hello.o(編譯生成可重定位目標文件)
2、-Wall使用 (1)建議初學都加這個選項。下面這個例子如果不加-Wall選項編譯器不報任何錯誤,但是得到的結果卻不是預期的。
#include
int main(void)
{
printf("Twoplus two is %f", 4);
return 0;
}
五、gcc編譯多文件
1、存在三個文件 hello_fn.h hello_fn.c main.c
2、一次性編譯 (1)gcc hello_fn.cmain.c –o newhello
3、獨立編譯 (1)gcc -Wall -c main.c -o main.o (2)gcc -Wall -c hello_fn.c -o hello_fn.o (3)gcc -Wall main.o hello_fn.o -o newhello
4、獨立編譯的好處在於 假如現在修改了main.c的程序,采用獨立編譯的話,由於hello_fn.c沒有修改,不需要編譯hello_fn.c。僅需要編譯main.c:gcc -Wall -c main.c -o main.o。而采用一次性編譯的話,每次都會編譯hello_fn.c和main.c,相當於多編譯了一次hello_fn.c。對於大型程序來說,采用獨立編譯可以很好的降低編譯的時間。