【发布时间】: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;什么编译器命令行?另外,请添加您尝试编译和链接的其余源代码。所有内容都在一个文件中,还是MyBase和MyDerived在单独的文件中?谢谢! -
相关问题:stackoverflow.com/…
-
常见的主题似乎是这与使用 RTTI 和/或将 C++ 与 C 代码链接有关。
-
你真的使用了“gcc - o derived derived.cpp”吗?您是否尝试删除“-”和“o”之间的空格?