分享
为什么问答平台  ›  专栏  ›  技术社区  ›  Kavindu Ravishka

代码块编译成功,但gcc失败了,为什么? - Codeblocks succeeded in compiling, but gcc failes, Why?

  •  0
  • Kavindu Ravishka  · 技术社区  · 1 周前

    我用的是Ubuntu 18。 我安装了代码块ide和bare gnu gcc编译器(命令行)。

    GCC版本7.4.0 (Ubuntu 7.4.0-1ubuntu 1~18.04.1)

    代码块 1月16日

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

    代码块(带有内置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;
    }
    

    代码块成功地编译它并在不引发错误的情况下给出输出。以及Sololearn在线编译器

    我正在学习C++

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

    GCC字符串_var.cpp-o字符串_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
    
    2 回复  |  直到 1 周前
        1
  •  0
  •   Sam Varshavchik    1 周前
    gcc string_var.cpp -o string_var.out
    

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

    g++ string_var.cpp -o string_var.out
    

    只是碰巧 gcc g++ 就编译实际代码而言,编译器理解 .cpp 文件包含C++代码,并相应地进行。

    但是,当链接生成的对象模块时, 海湾合作委员会 不向链接器提供运行时C++库(它仍然认为它只是一个C编译器,并且从来没有听说过C++),导致链接失败。

        2
  •  1
  •   Jesper Juhl Some programmer dude    1 周前

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

    C和C++是两种这样的语言,它们都可以用 gcc 前端程序。但是, 海湾合作委员会 默认情况下的程序是C代码,因为它不使用某些标志来构建C++程序。其中一件失踪的事是 海湾合作委员会 不与C++标准库链接。

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

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

    或者,更简单的是,使用C++的前端程序, g++ 以下内容:

    g++ string_var.cpp -o string_var.out