ホームページ > バックエンド開発 > C++ > GCC C で「仮想テーブルおよびコンストラクターへの未定義の参照」リンカー エラーが発生するのはなぜですか?

GCC C で「仮想テーブルおよびコンストラクターへの未定義の参照」リンカー エラーが発生するのはなぜですか?

Linda Hamilton
リリース: 2024-12-18 08:49:10
オリジナル
435 人が閲覧しました

Why Am I Getting

GCC C リンカー エラー: 仮想テーブルとコンストラクターへの未定義の参照

C では、仮想関数により、派生クラスがその関数で定義されたメソッドをオーバーライドできます。基本クラス。仮想関数を使用するプログラムをリンクする場合、リンカーはこれらのメソッドの定義がオブジェクト ファイルに存在することを必要とします。これらの定義を指定しないと、次のような未定義の参照エラーが発生します。

  • 「vtable for XXX」への未定義の参照
  • 「ClassName::ClassName()」への未定義の参照

可能原因

これらのエラーは、次のようなさまざまな理由で発生する可能性があります。

  1. 定義なしで仮想関数がオーバーライドされた: 前述したように、すべての仮想関数には次のものが必要です。それを使用する最終クラスの定義。子クラスで仮想関数を宣言しても定義していない場合、リンカは未定義の参照エラーを報告します。
  2. ヘッダー ファイルが欠落しています: クラスを含むヘッダー ファイル定義が、それを使用するソース ファイルに正しく含まれていない可能性があります。
  3. 間違ったライブラリ リンケージ:使用しているクラスの実装を含む正しいライブラリにリンクしています。

静的ライブラリとクラスの可用性の確認

  1. ライブラリ ビットネス: 静的ライブラリが 64 ビットかどうかを確認するには、次を使用します。ファイルコマンド:

    file -L <library_path>
    ログイン後にコピー

    ライブラリが 64 ビットの場合、64 ビット x86-64 共有オブジェクトが表示されます。

  2. クラスの可用性: objdump -t コマンドを使用して、ライブラリに特定のファイルが含まれているかどうかを確認します。 class:

    objdump -t <library_path> | grep <class_name>
    ログイン後にコピー

    クラスが存在する場合、出力にリストされます。

問題例

提供されたエラー ログに示されているように、SomeClass::close() への未定義の参照は、クラスが使用されているものの定義されていないことを示しています。同様に、SomeClass::SomeClass() および SomeOtherClass の vtable への未定義の参照は、SomeOtherClass クラスのコンストラクターと仮想テーブルがオブジェクト ファイルで定義されていないことを示唆しています。

Solution

この問題を解決するには、すべての仮想関数が適切な子クラスで定義されていること、必要なヘッダー ファイルが含まれていること、および正しいライブラリが適切な子クラスにリンクされていることを確認してください。プログラム。

以上がGCC C で「仮想テーブルおよびコンストラクターへの未定義の参照」リンカー エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート