C ++ VisualStudio2012プロジェクトで使用したいベンダーからのdllを入手しました。ファイルが付属してい.lib
ます。
リンクすると、次のようになります。
Error 1 error LNK2019: unresolved external symbol __imp__FT_CreateDeviceInfoList referenced in function "int __cdecl Ftexam(void)" (?Ftexam@@YAHXZ) C:\Users\Terry\Documents\Visual Studio 2012\Projects\Win32Project1\Win32Project1\ftexam.obj ftexample
同様の投稿を読んだことがありますが、どこにも行きません。私はそれらの答えに従ってすべてをやっていると思いますが、リンクすると未定義の参照エラーが発生します。
- dll.libファイルを/Linker/AddionalDependenciesリストに追加しました。
- dll.hファイルがソースに含まれていることを確認しました
- 私は
dll.lib
自分のプロジェクトディレクトリにファイルを置き、そこからファイルを削除すると、cannot find dll.lib
リンク時に取得することを確認しました(つまり、「ビルド中」です)
提供されたdll.h
ヘッダーファイルには、次のものがあります。
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
.
.
#ifdef __cplusplus
extern "C" {
#endif
typedef ULONG FT_STATUS;
.
.
DLL_API FT_STATUS FT_CreateDeviceInfoList(
LPDWORD lpdwNumDevs
);
そして私の呼び出しコードは次のとおりです。
#include dll.h
int Ftexam(){
FT_STATUS ftStatus=0;
DWORD numDevs = 0;
// create the device information list
ftStatus = FT_CreateDeviceInfoList(&numDevs);
}
おそらくいくつかの名前マングリングが行われていることに気付いたので、dependsを使用してDLLシンボルを調べました。「UndecorateC++関数」オプションが無効になっているこれらのエクスポートが一覧表示されます(つまり、これらはマングルされていないエクスポートです)。
FT_Open
FT_Close
FT_Read
....
FT_CyclePort
FT_CreateDeviceInfoList< <<<<<this reference!!!!
FT_GetDeviceInfoList
上記で特定されたエクスポートは明らかに一致しません__imp__FT_CreateDeviceInfoList
.libファイルの定義を確認できるツール、またはVisual Studioでそれを表示する方法はありますか?
アップデート:
dumpbinを使用すると、.libのシンボルを確認できました。
__imp_FT_CreateDeviceInfoList
instead of
__imp__FT_CreateDeviceInfoList
これは、32ビットバージョンではなく64ビットバージョンのDLLの.libに追跡しました。(私が最初にこれを解決しようとした組み合わせの1つ)。
投稿を簡略化するために、ヘッダーに次のものが含まれていることを示しました。
DLL_API FT_STATUS FT_CreateDeviceInfoList(LPDWORD lpdwNumDevs);
When in fact, it actually contains:
DLL_API FT_STATUS WINAPI FT_CreateDeviceInfoList(LPDWORD lpdwNumDevs);
WINAPIが#definedだったので
だから変わる
#define WINAPI
to
#define WINAPI __stdcall
正しい.libを使用すると、問題が修正されます。