[英]Compiling a C++ program with gcc
問題:如何用gcc編譯器編譯C++程序?
信息.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++ 之間有什么區別。 謝謝,
gcc實際上可以很好地編譯c ++代碼。 您收到的錯誤是鏈接器錯誤,而不是編譯器錯誤。
可能的情況是,如果您將編譯行更改為:
gcc info.C -lstdc++
這使它鏈接到標准的c ++庫,然后它將工作得很好。
但是,你應該讓你的生活更輕松,並使用g ++。
編輯:
[...] gcc將根據文件擴展名選擇正確的后端編譯器(即將.c編譯為C,將.cc編譯為C ++)並默認將二進制文件與標准C和GCC幫助程序庫相鏈接,而不管輸入語言; g ++也將基於擴展選擇正確的后端,除了我認為它將所有C源代碼編譯為C ++(即它將.c和.cc編譯為C ++),並且無論輸入語言如何,它在鏈接步驟中都包含libstdc ++。
如果你給代碼一個.c擴展名,編譯器認為它是C代碼,而不是C ++。 C ++編譯器驅動程序稱為g ++,如果使用gcc驅動程序,則會出現鏈接器問題,因為默認情況下標准C ++庫不會鏈接。 所以你要:
g++ myprog.cpp
甚至不要考慮使用大寫的.C擴展名,除非你永遠不想移植你的代碼,並准備好被你工作的人討厭。
使用g++
而不是gcc
。
gcc和g ++之間的區別是:
gcc | g++
compiles c source | compiles c++ source
使用g ++而不是gcc來編譯c ++源代碼。
默認情況下,gcc根據文件擴展名選擇語言,但您可以強制gcc使用-x選項選擇不同的語言后端:
gcc -x c++
更多選項在gcc手冊頁的“選項控制輸出類型”下詳細說明。 參見例如http://linux.die.net/man/1/gcc (在頁面上搜索文本-x language
)。
在gcc無法使用文件擴展名猜測語言的情況下,此工具非常有用,例如,如果您生成代碼並通過stdin將其提供給gcc。
它對我很有用。 只有cmd中的一行代碼。
首先,確認您已安裝gcc (用於c)或g ++ (用於c ++)編譯器。
在cmd中為gcc類型:
gcc --version
在cmd中為g ++類型:
g ++ --version
如果已安裝,請繼續。
現在,使用cmd編譯.c或.cpp
for .c語法:
gcc -o exe_filename yourfilename.c
例:
gcc -o myfile myfile.c
這里exe_filename(示例中為myfile)是您要在編譯后生成的.exe文件的名稱(注意:我沒有在此處添加任何擴展名)。 而yourfilename.c(示例中的myfile.c)是源文件 ,其擴展名為.c。
現在轉到包含.c文件的文件夾,在這里您將找到擴展名為.exe的文件。 打開它吧。 歡呼..
對於.cpp語法:
g ++ -o exe_filename yourfilename.cpp
之后,該過程與.c相同。
如果我沒記錯的話,gcc會根據后綴確定文件類型。 所以,讓它成為foo.cc,它應該工作。
而且,為了回答你的另一個問題, 那就是“gcc”和“g ++”之間的區別。 gcc是一個選擇正確編譯器的前端。
對於 .cpp 文件:
g++ myprog.cpp -o myprog
我的gcc 版本 10.3.0在 Ubuntu 上的更新。 即使我添加-lstdc++
或使用正確的擴展名,也必須在系統上安裝cc1plus
,否則會出現此錯誤:
gcc: fatal error: cannot execute ‘cc1plus’: execvp: No such file or directory
獲得它的一種方法是安裝g++
即使您不打算直接使用它,例如sudo apt install g++
。
現在,如果我使用擴展名.cc
我可以直接調用gcc
,但是,仍然會出現警告和錯誤。 要使用gcc
干凈,具有.c
擴展我不得不把它像這樣:
gcc -x c++ info.c -lstdc++
如果我使用.cc
擴展名, .cc
短,就像接受的答案一樣:
gcc info.cc -lstdc++
或者像其他人所說的那樣,只需使用g++ info.c
代替,不需要額外的參數來指示 C++,並且它適用於.c
、 .cc
和.cpp
擴展名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.