gcc的參數

2020-08-09 11:00:13

其餘相關內容可參考個人部落格

目錄

  • 常用選項
  • 預處理選項
  • 警告選項

常用選項

選項 作用
總體選項
-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 在生成的依賴檔案中,指定規則中的目標

接下來簡單介紹幾個例子:

  1. 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
    
  2. gcc -MM main.c
    終端輸出

    main.o: main.c defs.h
    
  3. gcc -M -MF main.d main.c
    則 「-M」 輸出的內容就儲存在 main.d 檔案中了

  4. -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 視警告爲錯誤;出現任何警告即放棄編譯