1. ホーム
  2. c++

[解決済み] g++ typeinfoへの未定義の参照

2022-02-09 18:27:09

質問

次のようなエラーに遭遇しました(解決策もオンラインで見つかりましたが、Stack Overflowには存在しません)。

(.gnu.linkonce.[stuff]): undefined メソッド] [オブジェクト]への参照 ファイル]:(.gnu.linkonce.[stuff]): 未定義の参照 `typeinfo for [クラス名]'

なぜ、quot;undefined reference to typeinfo"というリンカーエラーが発生するのでしょうか?

(裏で何が起こっているのか説明できれば、ボーナスポイント)

解決方法は?

考えられる理由の1つは、仮想関数を定義せずに宣言しているためです。

同じコンパイル単位で定義せずに宣言すると、他のどこかで定義されていることを示すことになります。これは、リンカー・フェーズが他のコンパイル単位(またはライブラリ)のいずれかを探そうとすることを意味します。

仮想関数を定義する例としては

virtual void fn() { /* insert code here */ }

この場合、宣言に定義を付けているので、リンカが後で解決する必要はありません。

行の

virtual void fn();

を宣言しています。 fn() を定義していないため、ご質問のようなエラーメッセージが発生します。

コードとよく似ていますね。

extern int i;
int *pi = &i;

であり、これは整数の i が別のコンパイルユニットで宣言されており、リンク時に解決する必要があります(そうでない場合は pi はそのアドレスに設定できません)。