gcc编译C ++代码:未定义引用`operator new [](unsigned long long)'

时间:2014-12-09 22:27:31

标签: c++ gcc g++

有一个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/)。

问题是:

  1. 最后两个命令中哪一个更好?
  2. 在我看来gcc正确地选择了正确的编译器,但随后使用了错误的链接器。是不是?
  3. 可能是minGW-win64中的一个问题吗?
  4. 正如我所见(纠正我,如果它错了)gcc是一个主要程序,它接受输入并决定如何处理它。如果没有gcc,我可以更好地使用-lstdc++。但如果不可能,我会更喜欢使用g++,而不知道gcc可能会错过什么。

    非常感谢您的考虑

1 个答案:

答案 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