2017-07-19 17 views
0

* .libからのいくつかの外部関数を使用するレガシープロジェクトを継承しました。私が聞いたところでは、* .libを使用するための構文は正しく、この は、使用したVisual Studioのどのバージョンでもビルド可能でした。 (つまり、extern "C"プロトタイプファイルがあり、すべての関数シグネチャが正しい)。C++ Visual Studio、.libファイルを使用して未解決の外部シンボル

構築し、私が手に「エラーLNK2019:未解決の外部シンボル_A86_ReadConfigReg機能で参照12 @ ...」

私は、これは*の.lib以降* .LIBファイルに関連していることをかなり確信していますファイルには名前に "A86"が含まれています...同じ名前の* .dllもあります。

私はプロジェクトのプロパティ - >リンカ - >入力に行き、* .libファイル名を "Additional Dependencies"に記載しましたが、運はありません。 * .lib & * .dllを実行可能な場所にコピーして、インクルードディレクトリを追加しようとしました。しかし、運がない。

このエラーを修正するにはどうすればよいですか?

答えて

0

まず、ライブラリを調べて、参照されている機能があることを確認します。 MSVC開発者のコ​​マンドプロンプトを起動し、DUMPBIN.EXE

構文を実行します。

dumpbin /exports <full path library name> 

をこれはあなたのライブラリからエクスポートされたすべてのシンボルのリストを提供します。

あなたはそこから何をすべきかをより明確に理解できます。

[EDIT]

DUMPBINは、あなたが少なくとも二つのこと....それあなたのlibに輸出__cdecl署名ではなく、あなたのリンカが期待[email protected]よう__stdcall署名であるA86_ReadConfigRegと呼ばれる機能を、あなたに言いました優先度の高い順にチェック/チェックしてください。

  1. リンカーはパスカル呼び出し署名を探していますが、これは非常に奇妙です。あなたのプロジェクトは関数呼び出しのデフォルトとして__stdcallを持っていますか?それはProject Properties->C/C++->Advanced->Calling Conventionの/ GZスイッチによって制御されます。既定値は__cdecl(/ Gd)に設定する必要があります

  2. インクルードファイルがすべての関数宣言を囲んでいることを、extern "C" { }ブロックでチェックする必要があります。そうでなければ、ブロックを#includeディレクティブの周りに置くことができるので、ライブラリのファイルを変更する必要はありません。そのよう

extern "C" { 
#include <mylib.h> 
} 
+0

私はこれをやったのと、ダンプ・ビンからの出力は、ライン上映があります: "15 A86_ReadConfigRegを"。次のステップは何ですか? – user2913869

+0

@ user2913869リンカーの問題の最新の回答を確認してください。 –

+0

呼び出し規約は実際には__cdecl(/ Gd)に設定されていました。私は元の質問で述べたように、ヘッダーファイルは実際に "extern" C "{}と括弧の間にリストされたすべての関数プロトタイプを持っています。プロトタイプがこのように定義されていることがわかります:int _stdcall A86_ReadConfigReg(int iHandle、 DWORD dwOffset、DWORD * pdwResult);したがって、 "_stdcall"ラベルを "__cdecl"に変更してから完全に削除しましたが、それでもビルドできません。 – user2913869

関連する問題