codeblocks编译成功,gcc编译失败,为什么?

Codeblocks succeeded in compiling, but gcc failes, Why?

我正在使用 ubuntu 18。 我已经安装了 codeblocks ide 和裸 gnu gcc 编译器(命令行)

gcc 版本 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)

代码块16.01

我写了一个非常简单的代码来创建和打印一个字符串变量

代码块(内置gnu gcc编译器)编译成功。但是裸 gcc 编译器失败了

我也试过包括 iostream 和 stdio

#include <string>
using namespace std;

int main() {
    string a = "I am learning C++";
    printf("%s",a.c_str());
    return 0;
}

codeblocks 成功编译它并给出输出而没有引发错误。以及 sololearn 在线编译器也

我正在学习C++

我进入了cpp文件所在的文件夹并给出了以下命令

gcc string_var.cpp -o string_var.out

Bt 裸 gcc 编译器给出了一些我无法理解的编译器错误

/tmp/ccen8bfp.o: In function `main':
string_var.cpp:(.text+0x20): undefined reference to `std::allocator<char>::allocator()'
string_var.cpp:(.text+0x37): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)'
string_var.cpp:(.text+0x43): undefined reference to `std::allocator<char>::~allocator()'
string_var.cpp:(.text+0x4f): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::c_str() const'
string_var.cpp:(.text+0x74): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
string_var.cpp:(.text+0x96): undefined reference to `std::allocator<char>::~allocator()'
string_var.cpp:(.text+0xb0): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
/tmp/ccen8bfp.o:(.data.rel.local.DW.ref.__gxx_personality_v0[DW.ref.__gxx_personality_v0]+0x0): undefined reference to `__gxx_personality_v0'

collect2: error: ld returned 1 exit status
gcc string_var.cpp -o string_var.out

gcc 是一个 C 编译器。您要编译 C++ 代码:

g++ string_var.cpp -o string_var.out

碰巧 gccg++ 在编译实际代码的范围内工作,编译器理解 .cpp 文件包含 C++ 代码,并相应地进行。

然而,当 linking 生成的目标模块时,gcc 不向 linker 提供运行时 C++ 库(它仍然认为它只是一个 C编译器,并且从未听说过 C++),导致 link 失败。

GNU 编译器集合 (GCC) 可用于编译许多不同的语言。其中一些语言很常见,可以使用相同的 front-end 程序。

C 和 C++ 是两种这样的语言,它们都可以用 gcc front-end 程序编译。但是,gcc 程序默认用于 C 代码,因此不使用构建 C++ 程序所需的一些标志。缺少的一件事是 gcc 没有 link 与 C++ 标准库。

您可以通过显式 link 使用库来解决此问题:

gcc string_var.cpp -o string_var.out -lstdc++

或者,更简单,使用 C++ 的 front-end 程序,g++:

g++ string_var.cpp -o string_var.out