我正在尝试构建一个使用FTDI当前2.12.28 ftd2xx.lib静态库的WIN32控制台应用程序。我使用VS2013和本机非托管C ++。我的电话看起来像这样。
#include "../ftd2xx.h"
. . .
DWORD port_count = 0;
FT_STATUS status = FT_OK;
status = FT_CreateDeviceInfoList(&port_count);
当我编译时,我收到链接错误
GetTopazVCP.obj : error LNK2019: unresolved external symbol __imp__FT_CreateDeviceInfoList@4 referenced in function "unsigned long __cdecl Get1stVirtualComPort(unsigned long *)" (?Get1stVirtualComPort@@YAKPAK@Z)
未解析的符号 __ imp__FT_CreateDeviceInfoList @ 4 似乎是 FT_CreateDeviceInfoList 功能的错位名称版本。因此,在使用C命名的ftd2xx.lib中没有解决它。我不明白的是,当ftd2xx.h文件有条件extern时,编译器会破坏名称的原因" C"
#ifdef __cplusplus
extern "C" {
#endif
. . .
FTD2XX_API
FT_STATUS WINAPI FT_CreateDeviceInfoList(
LPDWORD lpdwNumDevs
);
...
#ifdef __cplusplus
}
#endif
包装所有FT _ ???声明。我已经确认在编译期间定义了__cplusplus。是什么原因造成意外名称损坏?
答案 0 :(得分:1)
正如ChronoKitsune在他的评论中指出的那样,这里没有名字。问题是我链接了FTDI库的静态版本,但ftd2xx.h头文件的默认值是声明FT _ ???用作DLL版本的调用。当我用ftd2xx.lib DLL版本替换ftd2xx.lib静态版本时,它已成功构建。 FTDI只提供一个版本的ftd2xx.h头文件并仔细查看它内部我发现如果你想使用静态ftd2xx.lib,你需要在包含ftd2xx.h之前#define FTD2XX_STATIC
#define FTD2XX_STATIC
#include "ftd2xx.h"