代码块编译成功,但gcc失败,为什么?

时间:2019-07-07 18:11:07

标签: c++ gcc compiler-errors codeblocks

我正在使用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

裸露的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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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 ++),导致您的链接失败。

相关问题