【问题标题】:Linux GCC Link Error on Simple Derived Classes简单派生类上的 Linux GCC 链接错误
【发布时间】:2017-04-27 19:00:04
【问题描述】:

我看到有人提出与此类似的问题,但并不完全如此,而且代码总是比我的复杂。我已将我的问题简化为最简单的术语:

使用 Linux GCC 编译器,这将构建良好:

class MyBase
{
    void Clear() {}
};

class MyDerived : public MyBase
{
    void Clear() {}
};

这不会:

class MyBase
{
    virtual void Clear() {}
};

class MyDerived : public MyBase
{
    void Clear() {}
};

链接阶段产生以下错误:

/tmp/ccmEFi6P.o:(.rodata._ZTI9MyDerived[_ZTI9MyDerived]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
/tmp/ccmEFi6P.o:(.rodata._ZTI6MyBase[_ZTI6MyBase]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
collect2: error: ld returned 1 exit status

对不起,我只是习惯了这里的格式化系统。

好的,我使用的编译器是 gcc,当我输入“gcc --version”时,我得到:

gcc (GCC) 4.9.1
Copyright (C) 2014 Free Software Foundation, Inc.

在处理更大的源文件集时会出现问题,但我总是喜欢尝试将代码减少到尽可能最小的位置,但仍会重现问题。我已经使用单个源文件完成了此操作:

derive.cpp:

class MyBase
{
    virtual void Clear() {}
};

class MyDerived : public MyBase
{
    void Clear() {}
};

int main()
{
    MyDerived md;
    return 0;
}

这就是字面上的全部。如果我从“Clear()”的基类声明中删除“虚拟”说明符,它将构建。如果我把它放回去,它就不会建立。在这两种情况下,我的命令行都是:

gcc - o derive derive.cpp

构建输出的全文是:

/tmp/cckxCssh.o:(.rodata._ZTI9MyDerived[_ZTI9MyDerived]+0x0): undefined 
reference to `vtable for __cxxabiv1::__si_class_type_info'
/tmp/cckxCssh.o:(.rodata._ZTI6MyBase[_ZTI6MyBase]+0x0): undefined reference 
to `vtable for __cxxabiv1::__class_type_info'
collect2: error: ld returned 1 exit status

任何帮助将不胜感激。

【问题讨论】:

  • 欢迎来到本站!查看tour 了解更多关于提出问题以吸引高质量答案的信息。请edit your question 提供更多信息好吗?什么 GCC 和 libc 版本;什么uname;什么编译器命令行?另外,请添加您尝试编译和链接的其余源代码。所有内容都在一个文件中,还是 MyBaseMyDerived 在单独的文件中?谢谢!
  • 相关问题:stackoverflow.com/…
  • 常见的主题似乎是这与使用 RTTI 和/或将 C++ 与 C 代码链接有关。
  • 你真的使用了“gcc - o derived derived.cpp”吗?您是否尝试删除“-”和“o”之间的空格?

标签: c++ linux gcc linker


【解决方案1】:

您正在使用gcc 编译C++ 代码,这是一个坏主意(如解释,例如here)。您的代码使用

编译和链接很好
g++ -o derive derive.cpp

【讨论】:

  • gcc - o派生derive.cpp
  • 谢谢。看起来那是探针。
  • gcc 会将 .cpp 文件识别为 C++ 并相应地编译/链接它们。可能的问题是命令行中的拼写错误。 '-' 和 'o' 之间有一个额外的空格。
  • @George 您是否尝试编译提供的代码或查看我链接的相关问题?该错误并非来自编译命令中的额外空间。 gcc 确实会编译 C++ 代码,但它不会选择正确的后端,从而导致链接阶段的错误。特别是,它不会链接到 libstdc++。您可以使用gcc -o derive derive.cpp -lstdc++ 来解决此问题,或者直接使用g++
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 2012-10-30
  • 2011-12-29
  • 2021-11-18
  • 2012-02-15
相关资源
最近更新 更多