[英]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.