ときどき GCC を使用すると、次のような不可解なエラーが発生します。
「クラス名の vtable」への未定義の参照
ライブラリの欠落が原因ではない場合、このあまり説明的ではないエラー メッセージが表示されると、コード ファイルを 1 行ずつ調べて、仮想関数の欠落している実装を見つける必要があります。不足している仮想関数、おそらくフラグなどをリンカに通知させる方法はありますか? それとも、私に言っているのかもしれませんが、私はそれが言っていることを理解していませんか?
gcc faqから:
C++ をビルドするときに、コンストラクタ、デストラクタ、または仮想テーブルが未定義であるとリンカが言うが、それらを定義した
ISO C++ 標準は、純粋仮想ではないクラスのすべての仮想メソッドを定義する必要があることを指定していますが、この規則 [class.virtual]/8 の違反に対する診断は必要ありません。この仮定に基づいて、GCC は暗黙的に定義されたコンストラクタ、代入演算子、デストラクタ、およびそのような最初の非インライン メソッドを定義する変換単位内のクラスの仮想テーブルのみを発行します。
したがって、この特定のメソッドの定義に失敗すると、明らかに関係のないシンボルの定義が不足しているとリンカが文句を言うことがあります。 残念ながら、このエラー メッセージを改善するには、リンカーの変更が必要になる場合がありますが、これは常にできるとは限りません。
解決策は、純粋ではないすべての仮想メソッドが定義されていることを確認することです。純粋仮想 [class.dtor]/7 と宣言されている場合でも、デストラクタを定義する必要があることに注意してください。
私が採用した解決策は、クラス名を検索し、仮想メソッドの宣言を探して、定義があるかどうかを確認することです。これに対する他の解決策は見つかりませんでした。