質問

C++ でプロジェクトを構築する場合、特に他の人のコードを使用する場合、リンク エラーのデバッグが難しいことがわかりました。リンクエラーのデバッグと修正に人々はどのような戦略を使用していますか?

役に立ちましたか?

解決

あなたの専門知識のレベルはわかりませんが、基本は次のとおりです。

以下は VS 2005 のリンカー エラーです。確かに、慣れていないと非常に混乱します。

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" (?does_not_exist@@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" (?TextScan@@YAXAAUFileTextStats@@PBD1_N2_J@Z)

注目すべき点がいくつかあります。

  • 「ByteComparator.obj」 - ByteComparator.cpp ファイルを探します。これがリンカの問題の原因です。
  • 「int __cdecl Does_not_exist(void)」 - これは見つからなかったシンボルです。この場合は、dos_not_exist() という名前の関数です。

現時点では、多くの場合、この関数のコード ベースを検索し、実装がどこにあるかを見つけるのが最も早い解決方法です。関数が実装されている場所がわかったら、あとは 2 つの場所がリンクされていることを確認するだけです。

VS2005 を使用している場合は、「プロジェクトの依存関係...」右クリック メニューを使用します。gcc を使用している場合は、makefile で実行可能ファイルの生成ステップ (gcc は多数の .o ファイルで呼び出されます) を調べ、不足している .o ファイルを追加します。


2 番目のシナリオでは、コードがない「外部」依存関係が欠落している可能性があります。Win32 ライブラリは、多くの場合、リンクする必要がある静的ライブラリに実装されます。この場合、次の場所に移動します。 MSDN または 「マイクロソフト・グーグル」 API を検索します。API の説明の下部にライブラリ名が記載されています。これをプロジェクト プロパティの [構成プロパティ] -> [リンカー] -> [入力] -> [追加の依存関係] リストに追加します。たとえば、関数 timeGetTime() の MSDN のページ ページの下部にある Winmm.lib を使用するように指示されます。

他のヒント

多くの場合、C ランタイム ライブラリが最大の原因となります。シングルスレッドかマルチスレッドか、静的か DLL に関して、すべてのプロジェクトが同じ設定になっていることを確認します。

MSDN ドキュメントは、特定の Win32 API 呼び出しに必要なライブラリが見つからない場合にそれを指摘するのに役立ちます。

それ以外では、通常は冗長フラグをオンにし、出力を調べて手がかりを探します。

私が遭遇した一般的なリンク エラーの 1 つは、関数がその定義方法と異なる方法で使用されている場合です。このようなエラーが表示された場合は、使用するすべての関数が .h ファイルで適切に宣言されていることを確認する必要があります。
また、関連するすべてのソース ファイルが同じ lib ファイルにコンパイルされていることを確認する必要があります。私が遭遇したエラーは、2 つのファイル セットを 2 つの別々のライブラリにコンパイルしており、ライブラリ間でクロスコールを行った場合です。

思い当たる失敗はありますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top