用gcc编译C ++程序


84

问题:如何使用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 ++有什么区别。谢谢,


可能重复的内容g ++和gcc
underscore_d

Answers:


136

gcc实际上可以编译c ++代码。您收到的错误是链接器错误,而不是编译器错误。

奇怪的是,如果将编译行更改为:

gcc info.C -lstdc++

使其链接到标准c ++库,则可以正常工作。

但是,您应该使生活更轻松,并使用g ++。


编辑:

Rup评论另一个答案时说得最好:

[...] gcc将根据文件扩展名选择正确的后端编译器(即,将.c编译为C,将.cc编译为C ++),并且默认情况下,仅针对标准C和GCC帮助器库链接二进制文件输入语言;g ++还将根据扩展名选择正确的后端,除了我认为它会将所有C源代码编译为C ++(即,将.c和.cc都编译为C ++),并且在链接步骤中将libstdc ++包括在内,而不管输入语言是什么。


41

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

g++ myprog.cpp

而且,甚至不要考虑使用大写的.C扩展名,除非您永远不想移植代码,并且准备好与所使用的人讨厌。


@Neil:据我所知,gcc确实认为.C(大写)扩展名是c ++扩展名。以下工作正常:gcc test.C -lstdc++ -o testg++ test.C -o test
埃文·特兰

3
@Evan是的,当然可以。但是,这并不意味着您应该使用它,因为它会引起可怕的可移植性问题,所有区分大小写的文件名也一样。C ++文件的扩展名应始终为.cpp。这不会造成任何问题,并保证可以在所有常见的操作系统上工作。


12

默认情况下,gcc根据文件扩展名选择语言,但是您可以使用-x选项强制gcc选择其他语言的后端,因此:

gcc -x c++

更多选项在gcc手册页的“控制输出类型的选项”下进行了详细说明。参见例如http://linux.die.net/man/1/gcc(在页面上搜索文本-x language)。

在gcc无法使用文件扩展名猜测语言的情况下,例如在生成代码并将其通过stdin馈送到gcc的情况下,此功能非常有用。


11

gcc和g ++之间的区别是:

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

使用g ++而不是gcc来编译c ++源代码。


16
比这里要复杂的多,如此处的其他答案所示。gcc将根据文件扩展名选择正确的后端编译器(即,将.c编译为C,将.cc编译为C ++),并且默认情况下,无论输入语言是什么,都将二进制文件仅链接到标准C和GCC帮助器库。g ++还将根据扩展名选择正确的后端,除了我认为它会将所有C源代码编译为C ++(即,将.c和.cc都编译为C ++),并且在链接步骤中将libstdc ++包括在内,而不管输入语言是什么。
Rup

1
@Rup:正确,这基本上就是我在回答中所说的。
埃文·特兰

1

如果我没记错的话,gcc根据后缀确定文件类型。因此,将其设置为foo.cc即可。

并且,要回答您的另一个问题,就是“ gcc”和“ g ++”之间的区别。gcc是选择正确编译器的前端。


1

对我来说效果很好。cmd中只有一行代码。

首先,确认您已安装gcc(对于c)或g ++(对于c ++)编译器。

对于gcc类型,以cmd为单位:

gcc --version

对于g ++类型,在cmd中:

g ++ --version

如果已安装,请继续。

现在,使用cmd编译.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扩展名的文件。只是打开它。欢呼..

对于.cpp语法:

g ++ -o exe_filename yourfilename.cpp

之后,该过程与.c相同。


2
问题是“如何使用gcc编译器编译C ++程序?” 不是“如何使用gcc编译器编译C程序?或如何使用g ++编译器编译C ++程序?”
DevX

好赶上!@DevX
Rajkumar Bansal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.