用 extern "C" 定义的 VS2013 C++ 编译器重整名称
VS2013 C++ Compiler Mangling name defined with extern "C"
我正在尝试构建一个 WIN32 控制台应用程序,该应用程序使用来自 FTDI 的当前 2.12.28 ftd2xx.lib 静态库。我正在使用 VS2013 和本机非托管 C++。我的电话是这样的。
#include "../ftd2xx.h"
. . .
DWORD port_count = 0;
FT_STATUS status = FT_OK;
status = FT_CreateDeviceInfoList(&port_count);
编译时出现 link 错误
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 是在编译期间定义的。知道是什么导致了意外的名称修改吗?
正如 ChronoKitsune 在他的评论中指出的那样,这里没有名称修改。问题是我正在链接 FTDI 库的静态版本,但 ftd2xx.h header 文件的默认设置是声明 FT_???用作对 DLL 版本的调用。当我用 ftd2xx.lib DLL 版本替换 ftd2xx.lib 静态版本时,它构建成功。 FTDI 只提供一个版本的 ftd2xx.h header 仔细观察它我发现如果你想使用静态 ftd2xx.lib 你需要在包含 [ 之前 #define FTD2XX_STATIC =13=]
#define FTD2XX_STATIC
#include "ftd2xx.h"
我正在尝试构建一个 WIN32 控制台应用程序,该应用程序使用来自 FTDI 的当前 2.12.28 ftd2xx.lib 静态库。我正在使用 VS2013 和本机非托管 C++。我的电话是这样的。
#include "../ftd2xx.h"
. . .
DWORD port_count = 0;
FT_STATUS status = FT_OK;
status = FT_CreateDeviceInfoList(&port_count);
编译时出现 link 错误
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 是在编译期间定义的。知道是什么导致了意外的名称修改吗?
正如 ChronoKitsune 在他的评论中指出的那样,这里没有名称修改。问题是我正在链接 FTDI 库的静态版本,但 ftd2xx.h header 文件的默认设置是声明 FT_???用作对 DLL 版本的调用。当我用 ftd2xx.lib DLL 版本替换 ftd2xx.lib 静态版本时,它构建成功。 FTDI 只提供一个版本的 ftd2xx.h header 仔细观察它我发现如果你想使用静态 ftd2xx.lib 你需要在包含 [ 之前 #define FTD2XX_STATIC =13=]
#define FTD2XX_STATIC
#include "ftd2xx.h"