我从我想在C++ Visual Studio 2012项目中使用的供应商那里获得了一个dll。它带有一个.lib
文件。将DLL链接到Visual C++时未定义的外部链接
链接时,我得到:
Error 1 error LNK2019: unresolved external symbol __imp__FT_CreateDeviceInfoList referenced in function "int __cdecl Ftexam(void)" ([email protected]@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符号。它列出了这些出口的“去除装饰C++功能”选项被禁用,(所以,这些都是未重整出口):
FT_Open
FT_Close
FT_Read
....
FT_CyclePort
FT_CreateDeviceInfoList< <<<<<this reference!!!!
FT_GetDeviceInfoList
标识的出口上面明显不符__imp__FT_CreateDeviceInfoList
是否有一个工具周围可以查看.lib文件中的定义,还是以某种方式让visual studio显示它?
UPDATE:
通过使用DUMPBIN的我能看到的.lib符号是
__imp_FT_CreateDeviceInfoList
instead of
__imp__FT_CreateDeviceInfoList
这个我跟踪到的.lib为DLL的64位版本,而不是的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被#define的
因此更改
#define WINAPI
to
#define WINAPI __stdcall
与具有正确的.lib固定沿
问题。
WINAPI应该已经被Windows正确定义。我承认你正在使用的图书馆,目前正在使用它,而无需修改。在包含库头之前,您是否“#include”? –