有一个C ++代码:
#include <stdio.h>
int main() {
int b = sizeof('a');
if(b==4) printf("I'm a C program!\n");
else printf("I'm a C++ program!\n");
}
像这样编译:
gcc main.cpp -o main
成功并给出:
I'm a C++ program!
然后在函数main
int *p1 = new int [1000];
失败了:
C:\Users\...\AppData\Local\Temp\cccJZ8kN.o:main1.cpp:(.text+0x1f): undefined reference to operator new[](unsigned long long)'
collect2.exe: error: ld returned 1 exit status
然后以下两个命令成功编译代码:
gcc main.cpp -o main -lstdc++
和
g++ main.cpp -o main
编译器是minGW-win64(http://mingw-w64.sourceforge.net/)。
问题是:
gcc
正确地选择了正确的编译器,但随后使用了错误的链接器。是不是?正如我所见(纠正我,如果它错了)gcc
是一个主要程序,它接受输入并决定如何处理它。如果没有gcc
,我可以更好地使用-lstdc++
。但如果不可能,我会更喜欢使用g++
,而不知道gcc
可能会错过什么。
非常感谢您的考虑
答案 0 :(得分:12)
gcc
is the GCC compiler-driver for C programs, g++
is the one for C++ programs.
两者都会根据文件扩展名猜测语言,除非被覆盖。
但是如果使用了错误的驱动程序,则默认选项将是错误的,例如在链接时省略用gcc
编译的C ++程序的C ++标准库。
你可以只添加-lstdc++
的库,但最好使用正确的驱动程序,例如普通的gcc may be missing other, subtler options。