天天看點

cc、gcc、g++、CC的差別概括

轉自:https://www.cnblogs.com/xj626852095/p/3648246.html

gcc是C編譯器;g++是C++編譯器;linux下cc一般是一個符号連接配接,指向gcc;gcc和g++都是GUN(組織)的編譯器。而CC則一般是makefile裡面的一個名字,即宏定義,嘿,因為Linux/Unix都是大小寫敏感的系統,這點一定要注意。

cc是Unix系統的C Compiler,而gcc則是GNU Compiler Collection,GNU編譯器套裝。gcc原名為Gun C語言編譯器,因為它原本隻能處理C語言,但gcc很快地擴充,包含很多編譯器(C、C++、Objective-C、Ada、Fortran、Java)。是以,它們是不一樣的,一個是古老的C編譯器,一個是GNU編譯器集合,gcc裡面的C編譯器比cc強大多了,是以沒必要用cc。

下載下傳不到cc的原因在于:cc來自于昂貴的Unix系統,cc是商業軟體。

Linux下的cc是gcc符号連接配接,可以通過$ls –l /usr/bin/cc來簡單察看,該變量是make程式的内建變量,預設指向gcc。cc符号連結和變量存在的意義在于源碼的移植性,可以友善的用gcc來編譯老的用cc編譯的Unix軟體,甚至連makefile都不用改在,而且也便于Linux程式在Unix下編譯。

誤區一:gcc隻能編譯C代碼,g++隻能編譯C++代碼。

兩者都可以,但請注意:

(1)字尾為.c的,gcc把它當作是C程式,而g++當作是c++程式;字尾為.cpp的,兩者都會認為是C++程式,注意,雖然C++是C的超集,但是兩者對文法的要求是有差別的。C++的文法規則更加嚴謹一些。

(2)編譯階段,g++會調用gcc,對于C++代碼,兩者是等價的,但是因為gcc指令不能自動和C++程式使用的庫聯接,是以通常用g++來完成連結,為了統一起見,幹脆編譯/連結統統用g++了,這就給人一種錯覺,好像cpp程式隻能用g++似的。

誤區二:gcc不會定義__cplusplus宏,而g++會

實際上,這個宏隻是标志着編譯器将會把代碼按C還是C++文法來解釋,如上所述,如果字尾為.c,并且采用gcc編譯器,則該宏就是未定義的,否則,就是已定義。

誤區三:編譯隻能用gcc,連結隻能用g++

嚴格來說,這句話不算錯誤,但是它混淆了概念,應該這樣說:編譯可以用gcc/g++,而連結可以用g++或者gcc -lstdc++。因為gcc指令不能自動和C++程式使用的庫聯接,是以通常使用g++來完成聯接。但在編譯階段,g++會自動調用gcc,二者等價。

C++的編譯器肯定可以編譯C的代碼,注意除了C++對C的文法擴充之外,編譯和連結C和C++的标準庫通常也不一樣呢,用gcc而非g++也編譯了C++的程式就證明了這一點。

注:符号連結是一種特殊類型的檔案,它的内容隻是一個字元串。它可能指向一個存在的檔案也可能什麼都不指向。當您在指令行或程式裡提到符号連結的時候,您實際上進入了它指向的檔案,前提是這個檔案是存在的。

用法:gcc [選項] 檔案...
選項:
  -pass-exit-codes         在某一階段退出時傳回最高的錯誤碼
  --help                   顯示此幫助說明
  --target-help            顯示目标機器特定的指令行選項
  (使用‘-v --help’顯示子程序的指令行參數)
  -dumpspecs               顯示所有内建 spec 字元串
  -dumpversion             顯示編譯器的版本号
  -dumpmachine             顯示編譯器的目标處理器
  -print-search-dirs       顯示編譯器的搜尋路徑
  -print-libgcc-file-name  顯示編譯器伴随庫的名稱
  -print-file-name=<庫>    顯示 <庫> 的完整路徑
  -print-prog-name=<程式>  顯示編譯器元件 <程式> 的完整路徑
  -print-multi-directory   顯示不同版本 libgcc 的根目錄
  -print-multi-lib         顯示指令行選項和多個版本庫搜尋路徑間的映射
  -print-multi-os-directory 顯示作業系統庫的相對路徑
  -Wa,<選項>               将逗号分隔的 <選項> 傳遞給彙編器
  -Wp,<選項>               将逗号分隔的 <選項> 傳遞給預處理器
  -Wl,<選項>               将逗号分隔的 <選項> 傳遞給連結器
  -Xassembler <參數>       将 <參數> 傳遞給彙編器
  -Xpreprocessor <參數>    将 <參數> 傳遞給預處理器
  -Xlinker <參數>          将 <參數> 傳遞給連結器
  -combine                 将多個源檔案一次性傳遞給彙編器
  -save-temps              不删除中間檔案
  -pipe                    使用管道代替臨時檔案
  -time                    為每個子程序計時
  -specs=<檔案>            用 <檔案> 的内容覆寫内建的 specs 檔案
  -std=<标準>              指定輸入源檔案遵循的标準
  --sysroot=<目錄>         将 <目錄> 作為頭檔案和庫檔案的根目錄
  -B <目錄>                将 <目錄> 添加到編譯器的搜尋路徑中
  -b <機器>                為 gcc 指定目标機器(如果有安裝)
  -V <版本>                運作指定版本的 gcc(如果有安裝)
  -v                       顯示編譯器調用的程式
  -###                     與 -v 類似,但選項被引号包覆,并且不執行指令
  -E                       僅作預處理,不進行編譯、彙編和連結
  -S                       編譯到彙編語言,不進行彙編和連結
  -c                       編譯、彙編到目标代碼,不進行連結
  -o <檔案>                輸出到 <檔案>
  -x <語言>                指定其後輸入檔案的語言
                           允許的語言包括:c c++ assembler none
                           ‘none’意味着恢複預設行為,即根據檔案的擴充名猜測
                           源檔案的語言

以 -g、-f、-m、-O、-W 或 --param 開頭的選項将由 gcc 自動傳遞給其調用的
 不同子程序。若要向這些程序傳遞其他選項,必須使用 -W<字母> 選項。      

繼續閱讀