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

Ale*_*lex 6 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");
}
Run Code Online (Sandbox Code Playgroud)

像这样编译它:

gcc main.cpp -o main
Run Code Online (Sandbox Code Playgroud)

它成功并给出:

I'm a C++ program!
Run Code Online (Sandbox Code Playgroud)

然后在函数内部的某处添加一行 main

int *p1 = new int [1000];
Run Code Online (Sandbox Code Playgroud)

它失败了:

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
Run Code Online (Sandbox Code Playgroud)

然后以下两个命令成功编译代码:

gcc main.cpp -o main -lstdc++
Run Code Online (Sandbox Code Playgroud)

g++ main.cpp -o main
Run Code Online (Sandbox Code Playgroud)

编译器是minGW-win64(http://mingw-w64.sourceforge.net/).

问题是:

  1. 最后两个命令中哪一个更好?
  2. 在我看来,gcc正确选择正确的编译器,但然后使用错误的链接器.这样对吗?
  3. 可能是minGW-win64中的一个问题?

正如我所见(纠正我,如果它是错的)gcc是一个主要程序,它接受输入并决定如何处理它.gcc如果没有它,我会更好地使用它-lstdc++.但如果不可能,我宁愿使用,g++因为不知道还有什么gcc可能错过.

非常感谢您的考虑

Ded*_*tor 13

gcc是C程序的GCC编译器驱动程序,g++是C++程序的驱动程序.
两者都会根据文件扩展名猜测语言,除非被覆盖.

但是如果你使用了错误的驱动程序,那么default-options将是错误的,比如gcc在链接时编译的C++程序中省略了C++标准库.

可以只添加库-lstdc++,但最好使用正确的驱动程序,因为普通的gcc 可能缺少其他更微妙的选项.