gcc引數記錄(一)

2022-08-24 16:21:15 字數 2150 閱讀 8925

本文記錄一些gcc相關引數,便於個人記憶,持續更新。

一、 -g

-g 可執行程式包含除錯資訊。-g 為了除錯用的,加入後可用gdb除錯。

二、 -o

-o指定輸出檔名,格式: -o output_filename,確定輸出檔案的名稱為output_filename,如果未指定會輸出為預設檔案,比如可執行檔案會生成為a.out,目標檔名是source.o,其中source是原始檔等。

三、-c

-c 只編譯不鏈結

產生.o檔案,就是目標檔案,不產生執行檔案。

四、-d

-d的作用是新增巨集定義,如-dndebug,作用如下:

ndebug 

標頭檔案assert.h定義的巨集受ndebug的影響。如果預程式在處理這個標頭檔案時已經定義了ndebug,assert巨集的內容就定義為空,這意味著assert巨集不起作用。

所以,可以在最終發布程式的時候可以用-dndebug關閉斷言功能或者把#define ndebug加每個原始檔中,但這條語句必須放在#include 之前。

1 #include 2

3#definne ndebug

4 #include 5

6int

main()

7

view code

trace(),assert()都只是在debug模式下才起作用的,如果定義了ndebug,編譯器會以為是非debug的模式(雖然編譯出來的程式還是很大),而且還可以進行除錯,此時trace(),assert()就沒有用了。就如同你編譯成release版的時候這些沒有用一樣。

#define debug 會重新開啟除錯開關

ndebug巨集由於字面意思,也被用於作為判斷debug/release版本的巨集,不過這個是編譯器、環境相關的,並不可靠。比如vc中,對生成的release版本專案,預設定義這個巨集,而gcc並沒有定義,得用-dndebug引數來定義。

五、-w

-w(小寫),表示關閉編譯時的警告,也就是編譯後不顯示任何warning,因為有時在編譯時編譯器會顯示一些例如資料轉換之類的警告,這些警告是我們平時可以忽略的。

六、-w和-wall

-w選項類似-wall,會顯示警告,但是只顯示編譯器認為會出現錯誤的警告。

-wall選項意思是編譯後顯示所有警告。

七、-o3

-o(大寫),意思開始編譯優化,level為3。

八、-shared

如果想建立乙個動態鏈結庫,可以使用gcc的-shared選項。輸入檔案可以是原始檔、彙編檔案或者目標檔案。

九、-fpic

-fpic選項作用於編譯階段,告訴編譯器產生與位置無關**(position-independent code)。

這樣一來,產生的**中就沒有絕對位址了,全部使用相對位址,所以**可以被載入器載入到記憶體的任意位置,都可以正確執行。

這是共享庫所要求的,共享庫被載入時,在記憶體的位置是不固定的。

十、-i引數與-l引數

-i(大寫i)用於指定頭檔案目錄。

-i /home/xhx/include表示將/home/xhx/include目錄作為第乙個尋找標頭檔案的目錄,尋找順序是:/home/xhx/include -> /usr/include -> /usr/local/include

-l用於指定程式鏈結庫路徑。

-l/home/xhx/lib表示將/home/xhx/lib目錄作為第乙個尋找庫檔案的目錄,尋找順序是:/home/xhx/lib -> /lib -> /usr/lib -> /usr/local/lib

-l (小寫l)用於指定鏈結庫名稱。

-lxhx 表示在上面的lib路徑中尋找libxhx.so的動態庫檔案,如果編譯選項中加入-static 表示尋找libxhx.a靜態庫檔案。

gcc 引數詳解

gcc引數詳解 介紹 gcc and g 分別是gnu的c c 編譯器 gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器 cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器 egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器 as 4.連線...

gcc引數詳解

gcc and g 分別是gnu的c c 編譯器 gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器as 4.連線目標 生成可執行程式 鏈結器...

GCC引數詳解

gcc and g 分別是gnu的c c 編譯器 gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器as 4.連線目標 生成可執行程式 鏈結器...