[介紹]
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參數篇(一)