對gcc 常用選項和簡單編寫

一、編譯器gcc

1、GCC簡介

    GCC(GNU Compiler Collection,GNU編譯器集合),是一套由 GNU 開發的編程語言編譯器。

2、執行過程

    雖然我們稱Gcc是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執行文件的過程要經歷四個相互關聯的步驟∶預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、彙編(Assembly)和鏈接(Linking)。
    命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。接着調用cc1進行編譯,這個階段根據輸入文件生成以.o爲後綴的目標文件。彙編過程是針對彙編語言的步驟,調用as進行工作,一般來講,.S爲後綴的彙編語言源代碼文件和彙編、.s爲後綴的彙編語言文件經過預編譯和彙編之後都生成以.o爲後綴的目標文件。當所有的目標文件都生成之後,gcc就調用ld來完成最後的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方。

3、常用選項
–help
顯示 gcc 幫助說明
–target-help
是顯示目標機器特定的命令行選項。
-E
預處理後即停止,不進行編譯、彙編及連接
-S
編譯後即停止,不進行彙編及連接
-c
編譯或彙編源文件,但不進行連接
-o file
指定輸出文件file,我們都知道程序的編譯要經歷預處理、編譯、彙編以及連接4個階段。在預處理階段,主要處理C語言源文件中的#ifdef、#include、以及#define等命令。在與處理過程中,GCC會忽略掉不需要預處理的輸入文件,該階段會生成中間文件*.i。
-l library
-llibrary
進行鏈接時搜索名爲library的庫。
例子: gcctest.clmotestIdirdir gcc test.c -I../inc -o test
-Ldir
把dir 加入到搜索庫文件的路徑列表中。
例子: gccI/home/fooL/home/fooltesttest.cotestDnamename1 gcc -DTEST_CONFIG test.c -o test

-Dname =definition
預定義名爲name ,值爲definition 的宏。
-static
在支持動態鏈接的系統上,阻止連接共享庫。該選項在其它系統上 無效。
-Wall
會打開一些很有用的警告選項,建議編譯時加此選項。

4、不常用選項

–version
顯示 gcc 版本號和版權信息
-x language
指明使用的編程語言。允許的語言包括:c c++ assembler none 。 ‘none’意味着恢復默認行爲,即根據文件的擴展名猜測源文件的語言。
-v
打印較多信息,顯示編譯器調用的程序。
-###
與 -v 類似,但選項被引號括住,並且不執行命令。
-pipe
使用管道代替臨時文件。
-combine
將多個源文件一次性傳遞給彙編器。
-ggdb
-ggdblevel
爲調試器 gdb 生成調試信息。level 可以爲1,2,3,默認值爲2。
-g
-glevel
生成操作系統本地格式的調試信息。-g 和 -ggdb 並不太相同, -g 會生成 gdb 之外的信息。level 取值同上。
-s
去除可執行文件中的符號表和重定位信息。用於減小可執行文件的大小。
-M
告訴預處理器輸出一個適合make的規則,用於描述各目標文件的依賴關係。對於每個 源文件,預處理器輸出 一個make規則,該規則的目標項(target)是源文件對應的目標文件名,依賴項(dependency)是源文件中 #include引用的所有文件。生成的規則可 以是單行,但如果太長,就用\’-換行符續成多行。規則 顯示在標準輸出,不產生預處理過的C程序。
-O0
禁止編譯器進行優化。默認爲此項。
-O
-O1
嘗試優化編譯時間和可執行文件大小。
-O2
更多的優化,會嘗試幾乎全部的優化功能,但不會進行“空間換時間”的優化方法。
-O3
在 -O2 的基礎上再打開一些優化選項:-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。
-Os
對生成文件大小進行優化。它會打開 -O2 開的全部選項,除了會那些增加文件大小的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章