在调试模式下编译时,我的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)
我们将从明显的位开始:这表明 cpp 未链接,或者调用是直接引用的而不是定义的(您可以定义纯虚拟)。
除此之外,构建设置可能存在差异 - 一般来说,这是因为默认符号可见性(Xcode 别名标志和推荐设置):
GCC_INLINES_ARE_PRIVATE_EXTERN = NO
GCC_SYMBOLS_PRIVATE_EXTERN = NO
Run Code Online (Sandbox Code Playgroud)
还有一些其他构建设置可能会干扰 - 不知道您的项目是如何构建的,所以......这个列表可能会变得相当大。