C++ の大きなコード ベースがあり、小さなリファクタリング (1 つのクラスが追加され、関連するメソッドがいくつか書き直された) の後、GCC 3 & 4 でリンカー エラーが発生し始めました。大規模な SDK のクラスをサブクラス化した小さなサンプル プログラム。
Web を検索しても、解決されたように見えるいくつかの古い GCC バグ以外の多くのヒントは得られませんでした。
問題の属性は次のようです。
- GCC 3.4.6 & 4.3.3 の最適化
-O2
- 時折の仮想継承を含む多重継承。
-
たとえば、サンクが欠落しているクラスで継承順序を変更すると、問題が「修正」
class Foo: public A, public B {}
されます。
class Foo: public B, public A {}
仮想継承は、参照カウントのために非常に一般的に使用される単一の基本クラスにのみ表示されます。私は、このクラスのすべての使用が実際に仮想パブリックであることを確認しました。偶然のパブリック継承ではありません。
明らかに、継承順序をいじっても問題は解決しません。他に何がありますか?