Linux 中的 cc 命令

2021-06-25 21:04:03 字數 3625 閱讀 6595

2010-01-14 12:48:35

|  分類:

linux|舉報

|字型大小訂閱

%cc foobar.c

%cc foo.c bar.c

注意,語法檢查就是──純粹的檢查語法。而不會檢測你可能犯的任何邏輯錯誤。比如無限迴圈,或者是你想用一元排序卻使用了氣泡排序。

cc 有很多選項,在幫助手冊中都可以找到。這裡列出了一些最重要的選項,並且有例子。

-o filename 

輸出的檔名。如果你不使用這個選項,cc 為產生 出乙個叫 a.out 的執行檔案。

%cc foobar.c

可執行檔案是 a.out

%cc -o foobar foobar.c

可執行檔案是 foobar

-c 僅僅編譯檔案,不會連線。如果你只想檢查你寫的測試程式的語法的話,這個選項非常有用。或者你會使用 makefile 。

%cc -c foobar.c

這會產生乙個 目標檔案 (不可執行) 叫做 foobar.o 。這個檔案可以和其他的目標檔案連線在一起構成乙個可執行檔案。

-g 產生乙個可除錯的可執行檔案。編譯器會在可執行檔案中植入一些資訊,這些資訊能夠把原始檔中的行數和被呼叫的函式聯絡起來。在你一步一步除錯程式的時候,偵錯程式能夠使用這些資訊來顯示源**。這是 非常 有用的;缺點就是被植入的資訊讓程式變得更大。通常情況下,開 發乙個程式的時候我們經常使用 -g ,但是我們在編譯乙個 「release 版本」 的程式的時候,如果程式工作得讓人滿意了,我 們就不使用 -g 編譯。

%cc -g foobar.c

這會產生乙個可除錯版本的程式。

-o 產生乙個優化版本的可執行檔案。編譯器會使用一些聰明的技巧產生出比普通編譯產生的檔案執行更快的可執行檔案。可以在 -o 加上數字來使用更高階的優化。但是這樣做經常會暴露出編譯器的優化器中的一些 錯誤。例如,2.1.0 版本的 freebsd 中的 cc 在某些情況 下使用了 -o2 的話,會產生出錯誤的**。

優化通常只在編譯乙個 release 版本的時候才被開啟。

%cc -o -o foobar foobar.c

這會產生乙個優化版本的 foobar 。

-o和 -o1指定1級優化

-o2 指定2級優化

-o3 指定3級優化

-o0指定不優化

$cc -c o3 -o0 hello.c

當出現多個優化時,以最後乙個為準!!

-i可指定查詢include檔案的其他位置.例如,如果有些include檔案位於比較特殊的地方,比如/usr/local/include,就可以增加此選項如下:

$cc -c -i/usr/local/include -i/opt/include hello.c

此時目錄搜尋會按給出的次序進行.

-e這個選項是相對標準的,它允許修改命令列以使編譯程式把預先處理的c檔案發到標準輸出,而不實際編譯**.在檢視c預處理偽指令和c巨集時,這是很有用的.可能的編譯輸出可重新定向到乙個檔案,然後用編輯程式來分析:

$cc -c -e hello.c >cpp.out

此命令使include檔案和程式被預先處理並重定向到檔案cpp.out.以後可以用編輯程式或者分頁命令分析這個檔案,並確定最終的c語言**看起來如何.

-m自動找尋原始檔中包含的標頭檔案,並生成乙個依賴關係.於是由編譯器自動生成的依賴關係,這樣一來,你就不必再手動書寫若干檔案的依賴關係,而由編譯器自動生成了。需要提醒一句的是,如果你使用gnu的c/c++編譯器,你得用「-mm」引數,不然,「-m」引數會把一些標準庫的標頭檔案也包含進來。

-d允許從編譯程式命令列定義巨集符號

一共有兩種情況:一種是用-dmacro,相當於在程式中使用#define macro,另一種是用-dmacro=a,相當於程式中的#define macro a.如對下面這**:

#ifdefine debug

printf("debug message\n");

#endif

編譯時可加上-ddebug引數,執行程式則列印出編譯資訊

下面的三個引數會迫使 cc 檢查你的**是否符合一些國際標準,經常被我們叫做 ansi 標準,雖然嚴格的來說它是乙個 iso 標準。

-wall 

開啟所有 cc 的作者認為值得注意的警告。不要只看這個選項的名字,它並沒有開啟所有 cc 能夠注意到的所有警告。

-ansi 

關閉大多數,但並不是所有,cc 提供的非 ansi c 特性。不要只看選項的名字,它並不嚴格保證你的**會相容標準。

-pedantic 

關閉 所有 cc 的非 ansi c 特性。

沒有這些選項,cc 能允許你按照標準使用一些非標準的擴充套件。有一些擴充套件非常有用,但不能與其他編譯器相容──實際上,這個標準的主要目的之一就是允許我們寫出可以在任何系統上的由任何編譯器編譯的**。這就叫做 可移植**

通常來說,你應該讓你的**盡可能的可以移植。否則你就不得不完全重寫你的**以便能夠在其他地方執行之──而且誰知道幾年後你是否還會用它?

%cc -wall -ansi -pedantic -o foobar foobar.c

這會在檢查 foobar.c 對標準的相容性以後產生乙個 foobar 可執行檔案。

-ldirname 

指定連線庫的搜尋目錄,-l(小寫l)指定連線庫的名字

$gcc main.o -l/usr/lib -lqt -o hello

指定連線庫的搜尋目錄,-l(小寫l)指定連線庫的名字

上面的命令把目標檔案main.o與庫qt相連線,連線時會到/usr/lib查詢這個庫檔案.也就是說-l與-l一般要成對出現.

-llibrary 

在連線的時候指定乙個函式庫。

最常見的情況就是當你編譯乙個使用了一些 c 中的數學函式的時候。不像大多數其他的平台,這些函式都不在 c 的標準庫裡面。你必須告訴編譯器加 上這些庫。

這個規則就是,如果庫的名字叫做 libsomething .a ,你就必 須給 cc 這樣的選項 -lsomething 。例如,數學庫 叫做 libm.a ,因此你給 cc 的選 項就是 -lm 。一般情況下,我們要把這個選項放到命令列的 最後。

% cc -o foobar foobar.c -lm 

這個會把數學函式庫連線到 foobar 裡面。

如果你要編譯 c++ **,你需要 -lg++ ,或者 -lstdc++ 如果你使用的是 freebsd 2.2 或者更高版本,來 連線 c++ 庫。或者,你可以執行 c++ 而不是 cc 來編譯 c++ **。在 freebsd 上, c++ 也可以通過執行 g++ 來喚醒。

%cc -o foobar foobar.cc

-lg++

對於 freebsd 2.1.6 或者更低的版本

%cc -o foobar foobar.cc -lstdc++

對 freebsd 2.2 或者更高的版本

%c++ -o foobar foobar.cc

兩種情況都會從 c++ 原始檔 foobar.cc 產生乙個 可執行檔案 foobar 。注意,在 unix ® 系統中,c++ 源 檔案的傳統字尾是 .c ,.cxx 或 者 .cc ,而不是 ms-dos ® 型別的 .cpp (這個字尾已經被用到了其他的地方)。 gcc 根據這個約定來確定應該使用何種型別的編譯器來編譯原始檔。但是,這個限制不再起作用了,因此現在你可以自由的使用 .cpp 這個字尾來命名你的 c++ 原始檔!

Linux 中的 cc 命令

cc foobar.c 就會把foobar.c cc foo.c bar.c 注意,語法檢查就是 純粹的檢查語法。而不會檢測你可能犯的任何邏輯錯誤。比如無限迴圈,或者是你想用一元排序卻使用了氣泡排序。cc 有很多選項,在幫助手冊中都可以找到。這裡列出了一些最重要的選項,並且有例子。o filenam...

Linux 中的 cc 命令

cc foobar.c cc foo.c bar.c 注意,語法檢查就是 純粹的檢查語法。而不會檢測你可能犯的任何邏輯錯誤。比如無限迴圈,或者是你想用一元排序卻使用了氣泡排序。cc 有很多選項,在幫助手冊中都可以找到。這裡列出了一些最重要的選項,並且有例子。o filename 輸出的檔名。如果你不...

C C中的預處理命令

分析 預編譯又稱為預處理 是做些 文字的替換工作。處理 開頭的指令 比如拷貝 include包含的檔案 define 巨集定義的替換 條件編譯等,就是為編譯做的預備工作的階段,主要處理 開始的預編譯指令,預編譯指令指示了在程式正式編譯前就由編譯器進行的操作,可以放在程式中的任何位置。c c 編譯系統...