【问题标题】:"non-virtual thunk to <method name>", referenced from: Vtable for <classname>in <objectfile.o>"non-virtual thunk to <method name>",引用自:Vtable for <classname>in <objectfile.o>
【发布时间】:2011-08-15 10:07:09
【问题描述】:

在调试模式下编译时,我的 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 中定义的,那么它对两者都适用目标。

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

有人知道导致此错误的原因吗?

【问题讨论】:

    标签: c++ xcode linker


    【解决方案1】:

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

    在我的例子中,实现是在一个阻止实际编译的#define 中。对于这种常见错误,GCC 应该有更明确的信息,例如

    virtual function <function> defined but not implemented in class <class>
    

    【讨论】:

    • “当我们定义时(在 .h 中)” - 你的意思是声明。定义 = 实施。
    • @underscore_d 我想我必须同意。类声明class Foo;。类定义 class Foo{int a;}; 。类实现 AFAIK 在那里,您在其中定义了方法,因此在 .cpp 文件中。请参阅stackoverflow.com/questions/1410563/…
    • @DawidPi 但你说的是不同的东西。我们另外两个人在谈论成员函数,而不是类。在类定义中指定成员函数的签名是一个函数声明
    • 啊,是的,那么对不起:)
    【解决方案2】:

    使用 C++/QtCreator 开发时遇到此问题,这是由于在 .pro 文件中多次包含同一个文件造成的。确保检查每个必要的头文件/源文件仅在HEADERS += \SOURCES += \ 下列出一次!

    【讨论】:

      【解决方案3】:

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

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

      GCC_INLINES_ARE_PRIVATE_EXTERN = NO
      GCC_SYMBOLS_PRIVATE_EXTERN = NO
      

      还有一些其他的构建设置可能会干扰 - 了解您的项目的结构,所以......这个列表可能会变得相当大。

      【讨论】:

      • 使用链接的 C++ 库就遇到了这个问题。您能否澄清一下,您上面提到的那些设置是它们应该是的值还是(可能不正确的)默认值?
      • @JOM 假设 NO 如果您不知道作者的意图。还要确保您的异常和 rtti 信息像在 dylib 中一样生成,最后,验证该类型的虚函数是否都有定义(如果源可用)。
      猜你喜欢
      • 2022-12-02
      • 2021-09-16
      • 2010-11-08
      • 2022-12-02
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      相关资源
      最近更新 更多