Linux下常用的gcc參數
首先說一下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語言特性