我从供应商那里获得了一个我想在 C++ Visual Studio 2012 项目中使用的 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/Addional Dependencies 列表中。
- 我已确保 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符号。它列出了禁用“Undecorate C++ 函数”选项的这些导出,(因此,这些是未损坏的导出):
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
这是我跟踪到 .lib 的 64 位版本的 DLL 而不是 32 位版本的。(我首先尝试解决的组合之一)。
为了简化帖子,我指出标题包含:
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 一起解决了这个问题。