"non-virtual thunk to <method name>" ,引用自:Vtable <classname>for in <objectfile.o>

"non-virtual thunk to <method name>", referenced from: Vtable for <classname>in <objectfile.o>

本文关键字:lt gt classname Vtable for in objectfile 引用 non-virtual thunk method      更新时间:2023-10-16

当在调试模式下编译时,我的xcode编译有这些链接错误:

"<method name>", referenced from: 
Vtable for <classname>in <objectfile.o>
"non-virtual thunk to <method name>", referenced from: 
Vtable for <classname>in <objectfile.o>

奇怪的是:它只发生在我的一个构建目标中(这两个目标对于该代码来说几乎是相同的),加上如果这些方法是在头文件中定义的,而不是在.cpp中定义的,它对两个目标都有效。

所有这些方法都是纯虚的。发生这些错误的类继承自多个类,但只有其中一个类导致这些错误。

有人知道是什么导致这个错误吗?

也遇到了同样的问题。当我们定义了一个虚成员函数(在.h头文件中)但没有实现它(在.cpp文件中)时,就会发生这种情况。

在我的例子中,实现是在一个阻止实际编译的#define中。对于诸如

之类的常见错误,GCC应该有更明确的消息。
virtual function <function> defined but not implemented in class <class>

在使用c++/QtCreator开发时遇到此问题,这是由于在中多次包含相同的文件引起的。箴文件。确保检查每个必要的头文件/源文件只在HEADERS += SOURCES += 下列出一次!

我们将从明显的位开始:这表明CPP没有链接进去,或者调用被直接引用而没有定义(您可以定义一个纯虚函数)。

除此之外,在构建设置中可能会有差异——通常,这是因为默认的符号可见性(Xcode别名标志和推荐设置):
GCC_INLINES_ARE_PRIVATE_EXTERN = NO
GCC_SYMBOLS_PRIVATE_EXTERN = NO

有一些其他的构建设置可能会干扰-我知道你的项目是如何结构的,所以…这个列表可以变得相当大。