其餘相關內容可參考個人部落格
選項 | 作用 |
總體選項 | |
-c | 編譯或彙編原始檔,但是不作連線.編譯器輸出對應於原始檔的目標檔案。GCC預設用`.o'替換原始檔名後綴`.c',`.i',`.s'等等。GCC 忽略-c 選項後面任何無法識別的輸入檔案 |
-S | 編譯後即停止,不進行彙編。生成.s彙編原始檔 |
-E | 預處理後即停止,不進行編譯 |
-o file | 指定輸出檔案爲file |
鏈接選項 | |
-llibrary | 鏈接名爲 library 的庫檔案,鏈接器在標準搜尋目錄中尋找這個庫檔案,庫檔案的真正名字`liblibrary.a' |
-shared | 生成一個共用目標檔案,他可以和其他目標檔案連線產生可執行檔案 |
-Wl,option | 把選項 option 傳遞給聯結器.如果 option 中含有逗號,就在逗號處分割成多個選項.這個選項可以用於給動態庫傳入SO-NAME,格式爲-Wl,-soname, MYLIB.so |
-Idir | 在標頭檔案的搜尋路徑列表中新增 dir 目錄. |
-Ldir | 在`-l'選項的搜尋路徑列表中新增 dir 目錄 |
-static | 預設情況下, GCC在鏈接時優先使用動態鏈接庫,只有當動態鏈接庫不存在時才考慮使用靜態鏈接庫,如果需要的話可以在編譯時加上-static選項,強制使用靜態鏈接庫 |
偵錯選項 | |
-g(level) | 以操作系統的本地格式(stabs, COFF, XCOFF,或 DWARF).產生偵錯資訊. GDB 能夠使用這些偵錯資訊.-g可以指定輸出的偵錯資訊的等級,預設2級,最多-g3 |
-O0 | 不進行程式碼優化 |
-O1 -O2 -O3 |
不同等級優化,優化我們暫時不介紹 1.優化可能對偵錯帶來問題,任何級別的優化都將帶來程式碼結構的改變,例如對分支的合併和消除 2.記憶體操作順序改變帶來的問題,也就是volatile關鍵字起作用的時候啦 |
程式碼生成 | |
-fomit-frame-pointer | 取消幀指針,即不使用ebp,而是使用esp直接計算幀上的變數的位置,好處是可以多出一個ebp暫存器,但是壞處卻很多,比如幀上定址變慢,且無法偵錯,儘量不使用這個參數 |
-fPIC | 生成地址無關程式碼,一般用於動態庫,如果可執行檔案是動態鏈接的,那GCC預設會使用PIC來產生可執行檔案的程式碼段 |
選項 | 特點 | 共同點 |
-M | 依賴關係包含標準庫 | 預設開啓-E參數,使得編譯器在預處理結束就停止編譯 |
-MM | 依賴關係不包含標準庫 | |
-MD | 依賴關係包含標準庫 | 不開啓-E參數 |
-MMD | 依賴關係不包含標準庫 | |
-MF + fileName | 將依賴關係寫入到fileName檔案中 | |
-MT | 在生成的依賴檔案中,指定規則中的目標 |
接下來簡單介紹幾個例子:
gcc -M main.c
終端輸出
main.o: main.c defs.h \
/usr/include/stdio.h \
/usr/include/features.h \
/usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \
/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h \
/usr/include/bits/types.h \
/usr/include/bits/pthreadtypes.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/include/bits/wchar.h /usr/include/gconv.h \
/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h \
/usr/include/bits/stdio_lim.h
gcc -MM main.c
終端輸出
main.o: main.c defs.h
gcc -M -MF main.d main.c
則 「-M」 輸出的內容就儲存在 main.d 檔案中了
-MT選項
這個最爲重要,可以將.d檔案本身作爲目標加入到依賴檔案中,這樣就可在標頭檔案更新時,也更新依賴檔案
gcc main.c -MM -MF main.d -MT main.d -MT main.o
$ cat main.d #檢視生成的依賴檔案的內容
main.d main.o: main.c defs.h
注:依賴規則中 main.d 和 main.o 目標都是通過 「-MT」 選項指定的
警告選項我們簡單的例舉了幾個,不過我們使用的時候,使用-Wall
就可以開啓幾乎所有常用的警告啦,-Werror
代表將警告視爲錯誤,這個不包含在-Wall
中,需要單獨指出。
選項 | 作用 |
-fsyntax-only | 檢查程式中的語法錯誤,但是不產生輸出資訊 |
-w | 禁止所有警告資訊 |
-Wimplicit-int | 警告沒有指定型別的宣告 |
-Wimplicit-function-declaration | 警告在宣告之前就使用的函數 |
-Wimplicit | 上面兩個選項之和 |
-Wreturn-type | 若函數定義了返回值,而無return語句,則警告 |
-Wunused | 如果某個區域性變數除了宣告就沒再使用,或者宣告瞭靜態函數但是沒有定義,或者某條語句的運算結果顯然沒有使用, 編譯器就發出警告 |
-Wformat | 檢查對 printf 和 scanf 等函數的呼叫,確認各個參數型別和格式串中的一致 |
-Wuninitialized | 在初始化之前就使用自動變數.這些警告只可能做優化編譯時出現,因爲他們需要數據流資訊,只有做優化的時候才估算數據流資訊.如果不指定 `-O'選項,就不會出現這些警告 |
-Wparentheses | 在某些情況下如果忽略了括號,編譯器就發出警告 |
-Wall | 結合所有上述的`-W'選項 |
---|---|
-Werror | 視警告爲錯誤;出現任何警告即放棄編譯 |