ホームページ >バックエンド開発 >C++ >C リンカーが「未定義参照」エラーをスローするのはなぜですか?

C リンカーが「未定義参照」エラーをスローするのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-22 03:40:11343ブラウズ

Why Are My C   Linker Throwing

未定義の参照エラー: 原因の理解

C プロジェクトの構成中に、リンカが「XXX の vtable への未定義の参照」または「未定義の参照」のような不可解なエラーをスローすることがあります。 ClassName::ClassName() に。」これらのエラーは主に、仮想関数と継承に起因する問題を示しています。

仮想関数のオーバーライド

この問題は、子クラスが定義を提供せずにオーバーライドされた仮想関数を宣言した場合によく発生します。次のコード スニペットを考えてみましょう。

class Base { public: virtual void f() = 0; };
class Derived : public Base { public: void f(); };

この例では、子クラス Derived はオーバーライドされた関数 f() を宣言していますが、定義していません。この省略により、コンパイラは宣言を理解できますが、リンカは定義を見つけることができないため、リンカ エラーが発生します。

静的ライブラリの互換性を確認する方法

  1. ライブラリを確認するアーキテクチャ: リンクしている静的ライブラリが 64 ビットであることを確認するには、ライブラリのドキュメントを参照するか、 file コマンドを使用してライブラリ ファイルを検査します:

    file /path/to/library.a
  2. クラスの存在を確認: ライブラリに予期したクラスとメソッドが含まれていることを確認するには、nm コマンドを使用します。 :

    nm /path/to/library.a | grep SomeClass

問題

リンカー エラーを解決してリンク プロセスを正常に完了するには、子クラスで宣言された仮想関数の定義を提供し、関連するライブラリがリンク ステップに適切に含まれていることを確認してください。

以上がC リンカーが「未定義参照」エラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。