有一个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/).
问题是:
gcc正确选择正确的编译器,但然后使用错误的链接器.这样对吗?正如我所见(纠正我,如果它是错的)gcc是一个主要程序,它接受输入并决定如何处理它.gcc如果没有它,我会更好地使用它-lstdc++.但如果不可能,我宁愿使用,g++因为不知道还有什么gcc可能错过.
非常感谢您的考虑
Ded*_*tor 13
gcc是C程序的GCC编译器驱动程序,g++是C++程序的驱动程序.
两者都会根据文件扩展名猜测语言,除非被覆盖.
但是如果你使用了错误的驱动程序,那么default-options将是错误的,比如gcc在链接时编译的C++程序中省略了C++标准库.
您可以只添加库-lstdc++,但最好使用正确的驱动程序,因为普通的gcc 可能缺少其他更微妙的选项.