歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux下常用的gcc參數

Linux下常用的gcc參數

日期:2017/3/3 16:56:43   编辑:關於Linux

首先說一下gcc和g++分別是gnu的c和c++編譯器,而且它們在進行編譯的時候,一般需要分為四步:

①預處理,對於cpp會生成.i文件,使用預處理器cpp

②將預處理後的文件不轉換為匯編語言,生成.s文件,使用編譯器egcs

③將匯編文件變成目標文件,也就是生成機器碼,這裡就是生成.o文件,使用匯編器as

④連接目標代碼,生成可執行程序,使用連接器ld

其中主要參數為:

-x language filename它是設定文件使用的語言,此時後綴名是無效的,雖然我們約定c語言的後綴是.c,c++語言的後綴名是.cpp,但是此時我們可以隨意使用後綴名。通常可用的參數有:c、objective-c、c-header、c++、cpp-output、assembler、assembler-with-cpp。比如我們可以使用命令cpp -x c hello.xin

-x none filename 它是關閉上一個選項,讓gcc根據文件名的後綴自動判斷文件類型,比如gcc -x c hello.xin -x none hi.c

-c是只激活預處理、編譯和匯編,也就是它只把程序做成obj文件,我們可以使用gcc -c hello.c會生成.o的obj文件

-S只激活預處理和編譯,能夠把文件編譯成為匯編代碼,比如我們gcc -S hello.c會生成.s的匯編代碼,我們可以使用文本編輯器查看。

-E 只激活預處理,這個不生成文件,我們需要把它重定向到一個輸出文件裡面,比如gcc -E hello.c > xin.txt或者gcc -E hello.c |more來查看。

-o指定目標名稱,缺省gcc編譯出來的文件是a.out,我們可以使用gcc -o hello hello.c的方式。

-pipe使用管道代替編譯中的臨時文件,使用非gnu匯編工具的時候可能會有問問題。

-undef取消對任何非標准宏的定義

-Idir 在我們使用#include的時候,gcc會先在當前目錄查找我們所制定的頭文件,如果沒有找到,它會到缺省的頭目錄文件去找,如果使用-I指定了目錄,他會先在我們指定的目錄查找,然後到常規的目錄去找。

-I-是取消前一個參數的功能,一般在-Idir之後使用。

-C在預處理的時候,不刪除注釋信息,一般和-E使用,在分析程序的時候很方便

-M生成文件關聯的信息,包含目標文件所依賴的所有源代碼,我們可以用gcc -M hello.c來測試

-MM和-M一樣,但是他忽略由#include <file>造成的依賴關系

-MD和-M相同,但是將輸出導入到.d的文件裡面

-MMD和-MM相同,把輸出導入到.d的文件裡面

-library是指定編譯時使用的庫。

-Ldir指定編譯時,搜索庫的路徑,其中dir是我們的目錄的名稱。

-O0、-O1、-O2、-O3是編譯器的優化選項的四個級別,其中-O0表示沒有優化,-O1為默認值,而-O3的優化級別最高

-g只是編譯器,在編譯的時候,產生調試信息

-gstabs它以stabs格式產生調試信息,但是不包含gdb調試信息

-ggdb會產生gdb的調試信息

-static會禁止使用動態庫,因此編譯出來的東西一般都很大

-share會盡量使用動態庫,所以生成文件很小,但是需要使用動態庫

-traditional師徒讓編譯器支持傳統C語言特性

Copyright © Linux教程網 All Rights Reserved