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