使用GCC编译C++程序

115

如何使用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++程序吗? 顺便问一下,gccg++之间有什么区别?


可能是What is the difference between g++ and gcc?的重复问题。 - underscore_d
使用 gcc 编译 C 代码。使用 g++ 编译 C++ 代码。 - Jesper Juhl
9个回答

185

gcc实际上可以很好地编译C++代码。你收到的错误是链接错误,而不是编译器错误。

很有可能,如果你把编译行改成这样:

gcc info.C -lstdc++

如果链接到标准的C++库,它就可以正常工作。

然而,你最好还是使用g++来简化生活。


Rup他的评论中说得最好:

[...] gcc会根据文件扩展名(即将.c作为C编译,将.cc作为C ++编译)选择正确的后端编译器,并默认链接到只有标准C和GCC助手库,无论输入语言如何; g++也会根据扩展名选择正确的后端,除了我认为它将所有C源代码都编译为C ++(即它将.c和.cc都编译为C ++),并且无论输入语言如何,它都会在链接步骤中包含libstdc ++。


58

如果您将代码扩展名命名为 .c,编译器会认为它是C代码而不是C++代码。而C++编译器驱动程序称为 g++,如果您使用gcc驱动程序,则可能会遇到链接问题,因为默认情况下不会链接标准的C++库。所以您需要:

g++ myprog.cpp

不要考虑使用大写的.C扩展名,除非你永远不想移植你的代码,并且准备被你的同事所憎恨。


从我所了解的情况来看,gcc确实将.C(大写)扩展名视为c++扩展名。以下命令可以正常工作:gcc test.C -lstdc++ -o test或者g++ test.C -o test - Evan Teran
5
@Evan 是的,当然有区别。但这并不意味着您应该使用它,因为它会导致可移植性问题,就像所有大小写敏感的文件名一样。C++文件的扩展名应始终为 .cpp。这不会引起任何问题,并且保证在所有常见操作系统上都可以正常工作。 - anon

27

你应该使用g++而不是gcc


13
你能解释一下为什么吗? - noraj
4
请给出原因,并且答案不完整。我不知道标准答案是什么样子的? - Chaminda Bandara

16
默认情况下,gcc 根据文件扩展名选择语言,但是您可以使用 -x 选项强制 gcc 选择不同的语言后端,例如:
gcc -x c++

更多选项详见gcc手册中“控制输出类型的选项”。请参考gcc(1) - Linux man page(在页面上搜索文本-x language)等内容。这个功能在以下情况下非常有用:当gcc无法使用文件扩展名猜测语言时,例如当您通过标准输入生成代码并将其馈送给gcc时。

13

gccg++ 的区别是:

     gcc            |        g++
compiles C source   |   compiles C++ source

使用 g++ 编译 C++ 源代码,而不是使用 gcc


24
这个问题比其他答案中所说的要稍微复杂一些。GCC将根据文件扩展名选择正确的后端编译器(例如,将.c编译为C语言,.cc编译为C++语言),并且默认情况下仅链接标准C和GCC助手库,而不考虑输入语言。g++也将根据扩展名选择正确的后端,但我认为它会将所有的C源代码都编译成C++(即它将.c和.cc都编译为C++),并且无论输入语言如何,都会在链接时包含libstdc++库。 - Rup
2
@Rup:没错,这基本上就是我在回答中所说的。 - Evan Teran

3
如果我没记错的话,gcc会根据后缀名确定文件类型。所以,将其命名为foo.cc应该就可以工作了。
另外,回答你的另一个问题,“gcc”和“g++”之间的区别在于,“gcc”是一个前端,它选择正确的编译器。

2
Ubuntu上更新我的GCC版本10.3.0。即使我添加了-lstdc ++或使用正确的扩展名,系统中必须安装cc1plus。否则会出现以下错误:

gcc:致命错误:无法执行‘cc1plus’:execvp:没有那个文件或目录

一种获取它的方法是即使您不打算直接使用它,也要安装g++,例如sudo apt install g++
现在,如果我使用扩展名.cc,我可以直接调用gcc,但是警告和错误仍然会显示出来。要使用一个.c扩展名干净地使用gcc,我必须像这样调用它like this
gcc -x c++ info.c -lstdc++

如果我使用 .cc 扩展名,就会更短,像这个 已接受的答案
gcc info.cc -lstdc++

或者像其他人说的那样,只需使用g++ info.c。不需要额外的参数来指示C ++,它适用于.c.cc.cpp扩展名。

0

对我来说效果很好。只需要在Windows命令行(CMD)上输入一行代码。

首先,请确认您已经安装了gcc(用于C语言)或g++(用于C++语言)编译器。

在命令行上,对于gcc,请输入:

gcc --version

在命令行中,对于g++,输入以下内容:
g++ --version

如果已安装,则继续进行。
现在,使用命令行编译您的 .c 或 .cpp 文件。
对于 C 语法:
gcc -o exe_filename yourfilename.c

例子:

gcc -o myfile myfile.c

这里的exe_filename(例如中的myfile)是您想在编译后生成的.exe文件的名称(注意:此处没有放置任何扩展名)。而yourfilename.c(例如中的myfile.c)是您的源文件,具有.c扩展名。

现在进入包含您的.c文件的文件夹。在这里,您将找到一个带有.exe扩展名的文件。只需打开它。万岁...

对于C ++语法:

g++ -o exe_filename yourfilename.cpp

接下来,流程与C语言的语法相同。


2
问题是“如何使用gcc编译器编译C++程序?”,而不是“如何使用gcc编译器编译C程序?”或“如何使用g ++编译器编译C ++程序?” - DevX
不错的发现!@DevX - Rajkumar Bansal

0

对于一个 .cpp 文件:

g++ myprog.cpp -o myprog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接