% cc foobar.c
就會把 foobar.c 通過以上的步驟編譯出來。如果你有 多個文件要編譯,只要輸入
% cc foo.c bar.c
注意,語法檢查就是──純粹的檢查語法。而不會檢測你可能犯的任何邏輯 錯誤。比如無限循環,或者是你想用一元排序卻使用了冒泡排序。
cc 有很多選項,在幫助手冊中都可以找到。這裏列出了一 些最重要的選項,並且有例子。
-o filename
-c
-
僅僅編譯文件,不會連接。如果你只想檢查你寫的測試程序的語法的話, 這個選項非常有用。或者你會使用 Makefile 。
這會產生一個 目標文件 (不可執行) 叫做 foobar.o 。這個文件可以和其他的目標文件連接在一起 構成一個可執行文件。
-g
-
產生一個可調試的可執行文件。編譯器會在可執行文件中植入一些信息, 這些信息能夠把源文件中的行數和被調用的函數聯繫起來。在你一步一步調試程 序的時候,調試器能夠使用這些信息來顯示源代碼。這是 非常 有用的;缺點就是被植入的信息讓程序變得更大。通常情況下,開 發一個程序的時候我們經常使用
-g
,但是我們在編譯一個 “release 版本” 的程序的時候,如果程序工作得讓人滿意了,我 們就不使用-g
編譯。 -O
-
產生一個優化版本的可執行文件。編譯器會使用一些聰明的技巧產生出比 普通編譯產生的文件執行更快的可執行文件。可以在
-O
加 上數字來使用更高級的優化。但是這樣做經常會暴露出編譯器的優化器中的一些 錯誤。例如,2.1.0 版本的 FreeBSD 中的 cc 在某些情況 下使用了-O2
的話,會產生出錯誤的代碼。優化通常只在編譯一個 release 版本的時候才被打開。
這會產生一個優化版本的 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
-
允許從編譯程序命令行定義宏符號
-
程序中的#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 能允許你按照標準使用一些非標準的擴 展。有一些擴展非常有用,但不能與其他編譯器兼容──實際上,這個標準的主要 目的之一就是允許我們寫出可以在任何系統上的由任何編譯器編譯的代碼。這就叫做 可移植代碼
通常來說,你應該讓你的代碼儘可能的可以移植。否則你就不得不完全重寫你的 代碼以便能夠在其他地方運行之──而且誰知道幾年後你是否還會用它?
這會在檢查 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 這樣的選項
% cc -o foobar foobar.c -lm-lsomething
。例如,數學庫 叫做 libm.a ,因此你給 cc 的選 項就是-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++ 源文件!