2026年7月6日 星期一

gcc與g++ 參數

[介紹]

gcc and g++分別是gnu的c & c++編譯器 gcc/g++在執行編譯工作的時候,總共需要4步: 

Preprocessing,Compilation,Assembling 和 Linking

1. Preprocessing(預處理): 展開 #include、#define → 得到 .i

2. Compilation(編譯): 把 .i 翻譯成組合語言 → 得到 .s

3. Assembling(組譯): 把 .s 轉成二進位的目標檔 → 得到 .o

4. Linking(連結): 連接目標代碼,生成可執行程序[鏈接器ld]


[參數]:

對於不同類型的參數,在排列上不需依任何順序

兩個參數不可併成一個,如 -dr 這個參數便和 -d -r 在作用上有著極大的不同。

相同類型的參數,也沒有只能使用一個的限制。


-E:只作完 perprocess 便停止,不作接下來 compiler 等動作,並輸出到標準輸出 (stdout) 去,對於不需前置處理的檔案本參數無效。

  例子用法:

  gcc -E hello.c >; pianoapan.txt

  gcc -E hello.c | more

-S:只進行到 compiler 便停止,因此輸出為一組合語言檔。在內定的輸出檔名為輸入檔名去除 .c 或 .i 等字尾之後加上 .s 而成。

  例:gcc -S hello.c

  將生成.s的組合語言檔

-c:只 compile 或 assemble 輸入檔案,而不作連結,因此輸出為一目的檔 (object file),內定的檔名為去除 .c、.i 或是 .s 等之後加上 .o 而成。

  例:gcc -c hello.c

  將生成.o的obj文件

-o:設定輸出檔名;若沒此參數,會產生預設檔名 "a.out"。

  例:gcc -o hello hello.c


-pipe:在不同階段之編譯時,使用管線 (pipe) 取代暫存檔,在某些系統上的組譯程式 (assembler) 由於不能由管線讀取資料,而使得這參數無效,但對 GNU assembler 而言此參數當然可用。

  例:gcc -pipe -o hello hello.c

-------------------------------------------------------------------------------------------------------

-imacros file:將file文件的Global,擴展到gcc/g++的輸入文件,Global定義本身並不出現在輸入文件中

-Dmacro:相當於C語言中的#define macro

-Dmacro=defn:相當於C語言中的#define macro=defn

-Umacro:相當於C語言中的#undef macro

-undef:取消對任何非標準宏(Global)的定義

-------------------------------------------------------------------------------------------------------

-include file:包含某個代碼,簡單來說,就是便以某個文件,需 要另一個文件的時候,就可以用它設定,功能就相當於在代碼中使用#include<filename>

  例:gcc hello.c -include /root/pianopan.h

-Idir:對於用#include "file"時,gcc/g++會到-I制定的目錄查找,查找不到,然後將到系統的缺少的頭文件目錄查找。

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

-idirafter dir:在-I的目錄裡面查找失敗,就到這個目錄裡面查找

-iprefix prefix, -iwithprefix dir:一般一起使用,當-I的目錄查找失敗,會到prefix+dir下查找

-nostdinc:使編譯器不再系統缺少的頭文件目錄裡面找頭文件,一般和-I聯合使用,明確限定頭文件的位置

-nostdin C++:規定不在g++指定的標準路經中搜索,但仍在其他路徑中搜索,此選項在創libg++庫使用

-------------------------------------------------------------------------------------------------------

-llibrary:編譯時,使用的library

  例:gcc -lcurses hello.c

  使用ncurses庫編譯程序

-Ldir:制定編譯的時候,搜索library路徑。預設會找系統標準庫。

-------------------------------------------------------------------------------------------------------

-lrt:Realtime Extensions Library

    用途:

        -lrt連結到即時函式庫(librt),提供與POSIX 即時擴展相關的功能。

        包含:timers, message queues, shared memory and semaphores

    常見功能:

        clock_gettime和clock_settime:取得和設定時鐘時間。

        mq_open和mq_close:操作POSIX 訊息佇列。

        shm_open和shm_unlink:操作POSIX 共享記憶體物件。

-lz:Zlib Compression Library

    用途:

        -lz連結到Zlib 庫,一個用於壓縮和解壓縮功能

    常見功能:

        compress和uncompress:用於資料的壓縮和解壓縮。

        deflate和inflate:用於stream壓縮和解壓縮。

-ldl:Dynamic Linking Library(動態連結函式庫)

    用途:

        -ldl連結到動態連結庫(libdl),提供了對動態庫(shared libraries)的載入和使用的支援。

        用於運行時動態載入、尋找符號和卸載共享庫。

    常見功能:

        dlopen:用於開啟一個動態庫。

        dlsym:用於在開啟的庫中尋找符號(即函數或變數)。

        dlclose:用於關閉開啟的庫。

-lanl:Asynchronous Name Lookup Library

    用途:

        -lanl連結到非同步名稱解析庫(libanl),提供非同步DNS 解析功能。

        提供非阻塞方式的主機名稱解析,以提高網路應用程式的效能。

    常見功能:

        getaddrinfo_a:異步獲取位址信息,用於非阻塞主機名稱解析。

-------------------------------------------------------------------------------------------------------

-C:在預處理的時候,不刪除註釋信息,一般和-E使用,有時候分析程序

-M:生成文件關聯的信息。包含目標文件所依賴的所有源代碼你可以用gcc -M hello.c來測試一下,很簡單。

-MM:和上面的那個一樣,但是它將忽略由#include<file>; 造成的依賴關係。

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

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

-O0, -O1, -O2, -O3:編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺少值,-O3優化級別最高

-------------------------------------------------------------------------------------------------------

-g:產生作業系統認可格式 (native format) 的除錯碼 (可能為 stabs、COFF、XCOFF 或是 DWARF 之一),以便 GDB 除錯。

-ggdb:除了產生 native format 的除錯碼外,還再包含 GDB 專用的擴充部份。

-gstabs:產生 stabs 格式除錯碼,但不包含 GDB 的擴充部份,這是在大多數 BSD 系統上 DBX 所使用的格式,然而在 MIPS 和 Alpha 系統上卻會產生 DBX 所不能辨識的內嵌 (embedded) stabs 除錯碼。

-gstabs+:產生包含 GDB 擴充部份的 stabs 格式除錯碼,然而這樣別的除錯程式便無法用來除錯。

-------------------------------------------------------------------------------------------------------

-static:此選項將禁止使用動態庫,所以,編譯出來的東西,一般都很大,也不需要什麼

動態連接庫,就可以運行.

-share:此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫.


-Wa,option:此選項傳遞option給彙編程序; 如果option中間有逗號,就將option分成多個選項,然後傳遞給會彙編程序

-Wl.option:此選項傳遞option給連接程序; 如果option中間有逗號,就將option分成多個選項,然後傳遞給會連接程序.

  例:-Wl,-soname,libmylib.so.1 

  與shared 函式庫,相關

-------------------------------------------------------------------------------------------------------

 

請參考:

GCC指令參數

gcc.txt

[轉貼] 編織出個好程式--GCC參數篇(一)


沒有留言:

張貼留言