次のエラーが発生しました:
(.gnu.linkonce.[stuff]): [メソッド]への未定義の参照 [オブジェクト ファイル]:(.gnu.linkonce.[stuff]): `[クラス名]のtypeinfo'への未定義の参照
なぜこのような「typeinfo への未定義の参照」リンカー エラーが発生するのでしょうか?
背後で何が起こっているのか説明できる人はいますか?
ベストアンサー1
考えられる理由の 1 つは、仮想関数を定義せずに宣言していることです。
同じコンパイル ユニット内で定義せずに宣言すると、別の場所で定義されていることを示します。つまり、リンカー フェーズでは、他のコンパイル ユニット (またはライブラリ) のいずれかでそれを見つけようとします。
仮想関数を定義する例は次のとおりです。
virtual void fn() { /* insert code here */ }
この場合、宣言に定義を添付しているので、リンカーは後で定義を解決する必要がありません。
この線
virtual void fn();
定義せずに宣言するfn()
と、ご質問のエラー メッセージが表示されます。
次のコードと非常によく似ています:
extern int i;
int *pi = &i;
これは、整数がi
別のコンパイル単位で宣言されており、リンク時に解決する必要があることを示しています (そうでない場合は、pi
そのアドレスに設定できません)。