&引用;缺少非虚拟thunks“;继承顺序 我们在C++中有一个大的代码库,在一个小的重构(一个类添加和一些相关的方法被重写)之后,我们开始在GCC 3和4上获得链接错误。链接器错误特别是在小样本程序中“缺少对非虚拟thunks的引用”,该小样本程序在我们的大型SDK中对类进行了子类化

&引用;缺少非虚拟thunks“;继承顺序 我们在C++中有一个大的代码库,在一个小的重构(一个类添加和一些相关的方法被重写)之后,我们开始在GCC 3和4上获得链接错误。链接器错误特别是在小样本程序中“缺少对非虚拟thunks的引用”,该小样本程序在我们的大型SDK中对类进行了子类化,c++,gcc,thunk,C++,Gcc,Thunk,除了一些似乎已经解决的老GCC错误外,搜索web并没有给出很多提示 问题的特征似乎是: GCC 3.4.6和4.3.3使用-O2进行优化 多重继承,包括偶尔的虚拟继承 更改继承顺序,例如, Foo类:公共A,公共B{} 到 类Foo:public B,public A{} 在缺少thunks的类上“修复”了问题 虚拟继承只出现在一个非常常用的基类中,用于引用计数。我已经验证了这个类的每个用法都是虚拟公共的,而不仅仅是偶然的公共继承 显然,摆弄继承顺序并不能真正解决问题。还可能是什么?可能是

除了一些似乎已经解决的老GCC错误外,搜索web并没有给出很多提示

问题的特征似乎是:

  • GCC 3.4.6和4.3.3使用
    -O2进行优化
  • 多重继承,包括偶尔的虚拟继承
  • 更改继承顺序,例如,
    Foo类:公共A,公共B{}

    类Foo:public B,public A{}

    在缺少thunks的类上“修复”了问题
虚拟继承只出现在一个非常常用的基类中,用于引用计数。我已经验证了这个类的每个用法都是虚拟公共的,而不仅仅是偶然的公共继承

显然,摆弄继承顺序并不能真正解决问题。还可能是什么?

可能是


如果是这样,请检查线程

如果更改基类的声明顺序解决了问题,则可能意味着其中一个基类没有正确定义它声明的内容

例如,如果在类a中有一个(非虚拟)方法Func的声明,而在类B中有相同的方法Func,但从未为类a定义过它,那么在子类中第一次调用该方法时,将调用类a的版本,但在链接时,找不到引用。 如果更改继承顺序,将使编译器调用B::Func(已定义),然后链接器将找到它


总之,这是一个糟糕的设计,因为其行为将很难预测和调试。

您是否使用与编译库时相同的优化级别来链接库?更改后是否重新编译了整个程序、库、资源文件、pch()?我们有一个验证构建,每次将所有内容签入源代码管理时都会构建新的内容,因此是的。此消息可能意味着声明了一个虚拟函数,但未定义(或未链接定义)。但也可能是别的原因。你能不能逐字地引用一条错误消息?记住的是,一般来说,你不能保证你可以从不同的C++编译器甚至是同一C++编译器的不同版本链接代码。他们使用不同的约定来实现C++特性。