"非虚拟thunk到<方法名称>",引自:<objectfile>中的<classname>的Vtable>

rah*_*ark 13 c++ xcode linker

在调试模式下编译时,我的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>
Run Code Online (Sandbox Code Playgroud)

奇怪的是:它只发生在我的一个构建目标中(两个目标对于该代码几乎相同),如果这些方法在头文件中定义而不是.cpp,则它对两个目标都可以正常工作.

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

任何人都知道导致此错误的原因是什么?

小智 9

遇到了同样的问题.它只是在我们定义虚拟成员函数(在.h头文件中)但未实现它(在.cpp文件中)时发生的.

在我的例子中,实现是在#define内部阻止实际编译.海湾合作委员会应该为这种常见错误提供更明确的信息,例如

virtual function <function> defined but not implemented in class <class>
Run Code Online (Sandbox Code Playgroud)


jus*_*tin 0

我们将从明显的位开始:这表明 cpp 未链接,或者调用是直接引用的而不是定义的(您可以定义纯虚拟)。

除此之外,构建设置可能存在差异 - 一般来说,这是因为默认符号可见性(Xcode 别名标志和推荐设置):

GCC_INLINES_ARE_PRIVATE_EXTERN = NO
GCC_SYMBOLS_PRIVATE_EXTERN = NO
Run Code Online (Sandbox Code Playgroud)

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