【问题标题】:Codeblocks succeeded in compiling, but gcc failes, Why?Codeblocks 编译成功,但 gcc 失败,为什么?
【发布时间】:2019-07-07 18:11:07
【问题描述】:

我使用的是 ubuntu 18。 我已经安装了代码块 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

【问题讨论】:

  • 如果使用printf()函数,需要在文件顶部添加#include

标签: c++ gcc compiler-errors codeblocks


【解决方案1】:

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

C 和 C++ 就是这样的两种语言,都可以用gcc 前端程序编译。但是,gcc 程序默认情况下是用于 C 代码的,因此不要使用构建 C++ 程序所需的一些标志。其中缺少的一件事是gcc 没有与 C++ 标准库链接。

您可以通过显式链接库来解决此问题:

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

或者,更简单的是,使用 C++ 的前端程序,g++

g++ string_var.cpp -o string_var.out

【讨论】:

    【解决方案2】:
    gcc string_var.cpp -o string_var.out
    

    gcc 是一个 C 编译器。你想编译 C++ 代码:

    g++ string_var.cpp -o string_var.out
    

    碰巧gccg++ 在编译实际代码时工作,编译器知道.cpp 文件包含C++ 代码,并相应地继续。

    但是,当需要链接生成的对象模块时,gcc 没有向链接器提供运行时 C++ 库(它仍然认为它只是一个 C 编译器,并且从未听说过 C++),导致您的链接失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 2010-09-20
      • 1970-01-01
      • 2013-05-14
      相关资源
      最近更新 更多