2010-07-05 110 views
40

問題:如何使用gcc編譯器編譯C++程序?使用gcc編譯C++程序

info.c:

#include<iostream> 
using std::cout; 
using std::endl; 
int main() 
{ 
    #ifdef __cplusplus 
    cout << "C++ compiler in use and version is " << __cplusplus << endl; 
    #endif 
    cout <<"Version is " << __STDC_VERSION__ << endl; 
    cout << "Hi" << __FILE__ << __LINE__ << endl; 
} 

,當我嘗試編譯info.c

$ gcc info.C

Undefined      first referenced 
symbol        in file 
cout        /var/tmp/ccPxLN2a.o 
endl(ostream &)      /var/tmp/ccPxLN2a.o 
ostream::operator<<(ostream &(*)(ostream &))/var/tmp/ccPxLN2a.o 
ostream::operator<<(int)   /var/tmp/ccPxLN2a.o 
ostream::operator<<(long)   /var/tmp/ccPxLN2a.o 
ostream::operator<<(char const *) /var/tmp/ccPxLN2a.o 
ld: fatal: Symbol referencing errors. No output written to a.out 
collect2: ld returned 1 exit status 

是不是gcc編譯器能夠編制C++程序的? 在相關說明中,gcc和g ++有什麼區別。 謝謝,

+0

可能重複[g ++和gcc有什麼區別?](https://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc) – 2017-12-05 10:54:02

回答

77

gcc實際上可以編譯C++代碼就好了。您收到的錯誤是鏈接器錯誤,而不是編譯器錯誤。

賠率是,如果你改變編譯行是這樣的:

gcc info.C -lstdc++ 

這使得它鏈接到標準C++庫,那麼它會工作得很好。

但是,你應該讓你的生活更輕鬆,並使用g ++。


編輯:

Rup最好的說,它在his comment到另一個答案:

[...] GCC將 選擇正確的後端基於文件的編譯器 擴展名(即將 編譯爲.c爲C和a。cc作爲C++) ,並且僅針對 標準C和GCC輔助程序庫,通過 鏈接二進制文件,而不考慮輸入語言; 克++也將選擇基於擴展正確 後端除了 ,我認爲它編譯所有C源 如C++,而不是(即它編譯既 .c和.CC如C++),它包括 的libstdC++在其鏈路不管輸入語言的 如何。

15

使用g++而不是gcc

1

如果我沒有記錯,gcc從後綴中確定文件類型。所以,使它foo.cc,它應該工作。

而且,回答您的其他問題,是「gcc」和「g ++」之間的差異。 gcc是一個選擇正確編譯器的前端。

29

如果您將代碼擴展名爲.c,編譯器會認爲它是C代碼,而不是C++。而C++編譯器驅動程序稱爲g ++,如果使用gcc驅動程序,則會出現鏈接程序問題,因爲標準C++庫默認情況下不會鏈接。所以,你想:

g++ myprog.cpp 

而且甚至不考慮使用大寫.C擴展,除非你永遠不希望你的代碼移植,並準備通過那些和你一起工作來恨。

+0

@neil:從我所知道的情況來看,gcc確實認爲'.C'(capital)擴展是一個C++擴展。以下工作就好了:'gcc test.C -lstdC++ -o test'或'g ++ test.C -o test'。 – 2010-07-08 17:19:16

+2

@Evan是的,當然是的。這並不意味着你應該永遠使用它,因爲它會導致可怕的可移植性問題,就像所有區分大小寫的文件名一樣。 C++文件的擴展名應該總是.cpp。這不會造成任何問題,並且保證可以在所有常用操作系統上運行。 – 2010-07-08 18:28:49

4

++是gcc和G之間的差:

 gcc   |  g++ 
compiles c source | compiles c++ source 

使用克++代替GCC編譯器你C++源。

+11

這比這更復雜一點,就像在這裏的其他答案一樣。 gcc將根據文件擴展名選擇正確的後端編譯器(即,將C編譯爲.c,C編譯爲.cc),並且默認將二進制文件與標準C和GCC幫助程序庫鏈接在一起,而不管輸入語言如何; g ++也會根據擴展名選擇正確的後端,但我認爲它將所有C源代碼編譯爲C++(即,它將.c和.cc編譯爲C++),並且在其鏈接步驟中包含libstdC++而不考慮輸入語言。 – Rup 2010-07-08 17:11:01

+0

@Rup:正確的,這基本上就是我在回答中所說的。 – 2010-07-08 17:13:54

2

您可以強制使用GCC選擇具有這樣-x選項不同的語言後端:

gcc -x c++ 

更多選擇是在海灣合作委員會手冊頁詳細介紹。見例如http://linux.die.net/man/1/gcc

在gcc無法使用文件擴展名猜測語言的情況下,例如如果您生成代碼並通過stdin將其提供給gcc,此工具非常有用。

2

它對我很好。在cmd中只需一行代碼。

首先,確認是否已安裝了GCC(對於c)或克++(對於C++)編譯器。

在CMD爲GCC類型:

GCC --version

在CMD爲克++型:

克++ --version

如果安裝它然後繼續。現在

,編譯.C或使用的.cpp CMD

.C語法:

的gcc -o exe_filename yourfilename.c

例子:

gcc -o myfile myfile.c

這裏exe_filename(myfile中的例子)你的.exe文件你想在編譯後產生的名稱(注意:我沒有在這裏放任何擴展名)。和yourfilename.c(myfile.c在示例中)您的源文件其擴展名爲.c。

現在轉到包含.c文件的文件夾,在這裏您將找到一個帶有.exe擴展名的文件。只要打開它。華友..

對於。CPP語法:

克++ -o exe_filename yourfilename.cpp

它之後的處理是相同的.c。