linux下gcc的使用

2021-10-11 17:50:50 字數 3264 閱讀 2325

假設源程式檔名為test.c。

1. 無選項編譯鏈結

用法:#gcc test.c
2. 選項 -o
用法:#gcc test.c -o test
3. 選項 -e
用法:#gcc -e test.c -o test.i

作用:將test.c預處理輸出test.i檔案。

4. 選項 -s
用法:#gcc -s test.i

作用:將預處理輸出檔案test.i彙編成test.s檔案。

5. 選項 -c
用法:#gcc -c test.s

作用:將彙編輸出檔案test.s編譯輸出test.o檔案。

6. 無選項鏈結
用法:#gcc test.o -o test
7. 選項-o
用法:#gcc -o1 test.c -o test

作用:使用編譯優化級別1編譯程式。級別為1~3,級別越大優化效果越好,但編譯時間越長。

如果有多個原始檔,基本上有兩種編譯方法:
[假設有兩個原始檔為test.c和testfun.c]

1. 多個檔案一起編譯
用法:#gcc testfun.c test.c -o test
2. 分別編譯各個原始檔,之後對編譯後輸出的目標檔案鏈結。
用法:

#gcc -c testfun.c                    

//將testfun.c編譯成testfun.o

#gcc -c test.c

//將test.c編譯成test.o

#gcc -o testfun.o test.o -o test

//將testfun.o和test.o鏈結成test

以上兩種方法相比較,第一中方法編譯時需要所有檔案重新編譯,而第二種方法可以只重新編譯修改的檔案,未修改的檔案不用重新編譯。

當gcc在編譯過程中檢查出錯誤的話,它就會中止編譯;但檢測到警告時卻能繼續編譯生成可執行程式,因為警告只是針對程式結構的診斷資訊,它不能說明程式一定有錯誤,而是存在風險,或者可能存在錯誤。雖然gcc提供了非常豐富的警告,但前提是你已經啟用了它們,否則它不會報告這些檢測到的警告。

在眾多的警告選項之中,最常用的就是-wall選項。該選項能發現程式中一系列的常見錯誤警告,該選項用法舉例如下:

$ gcc -wall test.c -o test

該選項相當於同時使用了下列所有的選項:

◆unused-function:遇到僅宣告過但尚未定義的靜態函式時發出警告。 ◆unused-label:遇到宣告過但不使用的標號的警告。

◆unused-parameter:從未用過的函式引數的警告。 ◆unused-variable:在本地宣告但從未用過的變數的警告。

◆unused-value:僅計算但從未用過的值得警告。

◆format:檢查對printf和scanf等函式的呼叫,確認各個引數型別和格式串中的一致。

◆implicit-int:警告沒有規定型別的宣告。 ◆implicit-function-:在函式在未經宣告就使用時給予警告。

◆char-subscripts:警告把char型別作為陣列下標。這是常見錯誤,程式設計師經常忘記在某些機器上char有符號。

◆missing-braces:聚合初始化兩邊缺少大括號。 ◆parentheses:在某些情況下如果忽略了括號,編譯器就發出警告。

◆return-type:如果函式定義了返回型別,而預設型別是int型,編譯器就發出警告。同時警告那些不帶返回值 return語句,如果他們所屬的函式並非void型別。

◆sequence-point:出現可疑的**元素時,發出報警。

◆switch:如果某條switch語句的引數屬於列舉型別,但是沒有對應的case語句使用列舉元素,編譯器就發出警告(在switch語句中使用default分支能夠防止這個警告)。超出列舉範圍的case語句同樣會導致這個警告。

◆strict-aliasing:對變數別名進行最嚴格的檢查。

◆unknown-pragmas:使用了不允許的#pragma。

◆uninitialized:在初始化之前就使用自動變數。

需要注意的是,各警告選項既然能使之生效,當然也能使之關閉。比如假設我們想要使用-wall來啟用個選項,同時又要關閉unused警告,利益通過下面的命令來達到目的:

$ gcc -wall -wno-unused test.c -o test

下面是使用-wall選項的時候沒有生效的一些警告項:

◆cast-align:一旦某個指標型別強制轉換時,會導致目標所需的位址對齊邊界擴充套件,編譯器就發出警告。例如,某些機器上只能在2或4位元組邊界上訪問整數,如果在這種機型上把char *強制轉換成int *型別, 編譯器就發出警告。

◆sign-compare:將有符號型別和無符號型別資料進行比較時發出警告。

◆missing-prototypes:如果沒有預先宣告函式原形就定義了全域性函式,編譯器就發出警告。即使函式定義自身提供了函式原形也會產生這個警告。這樣做的目的是檢查沒有在標頭檔案中宣告的全域性函式。

◆packed:當結構體帶有packed屬性但實際並沒有出現緊縮式給出警告。

◆padded:如果結構體通過充填進行對齊則給出警告。

◆unreachable-code:如果發現從未執行的**時給出警告。

◆inline:如果某函式不能內嵌(inline),無論是宣告為inline或者是指定了-finline-functions選項,編譯器都將發出警告。

◆disabled-optimization:當需要太長時間或過多資源而導致不能完成某項優化時給出警告。

上面是使用-wall選項時沒有生效,但又比較常用的一些警告選項。本文中要介紹的最後乙個常用警告選項是-werror。使用該選項後,gcc發現可疑之處時不會簡單的發出警告就算完事,而是將警告作為乙個錯誤而中斷編譯過程。該選項在希望得到高質量**時非常有用。

linux 下gcc的使用

在linux系統中,可執行檔案沒有統一的字尾,系統從檔案的屬性來區分可執行檔案和不可執行檔案。而gcc則通過字尾來區別輸入檔案的類別,下面介紹gcc所遵循的部分約定規則。c為字尾的檔案,c語言源 檔案 a為字尾的檔案,是由目標檔案構成的庫檔案 c,cc或.cxx 為字尾的檔案,是c 源 檔案 h為字...

linux 下gcc的使用

在linux系統中,可執行檔案沒有統一的字尾,系統從檔案的屬性來區分可執行檔案和不可執行檔案。而gcc則通過字尾來區別輸入檔案的類別,下面介紹gcc所遵循的部分約定規則。c為字尾的檔案,c語言源 檔案 a為字尾的檔案,是由目標檔案構成的庫檔案 c,cc或.cxx 為字尾的檔案,是c 源 檔案 h為字...

linux下gcc編輯器使用

gcc是乙個c語言編譯器,全程為gnu c compiler的英文縮寫。gcc具有交叉編譯功能,即在乙個平台下編譯另乙個平台的 gcc支援的字尾名解釋 c c語言源 檔案 a 有目標構成的檔案庫檔案,靜態庫檔案 c cc 或 cxx c 源 檔案 h 程式所包含的標頭檔案 i 已經與處理過的c原始碼...