c++ - VS2013 C++ Compiler Mangling 名称定义为 extern "C"

标签 c++ c visual-studio-2013 ftdi extern-c

我正在尝试构建一个 WIN32 控制台应用程序,该应用程序使用来自 FTDI 的当前 2.12.28 ftd2xx.lib 静态库。我正在使用 VS2013 和 native 非托管 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 是在编译期间定义的。知道是什么导致了意外的名称修改吗?

最佳答案

正如 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"

关于c++ - VS2013 C++ Compiler Mangling 名称定义为 extern "C",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47087020/

相关文章:

c - 使用 goto 跳过 if 语句是否更快

windows - 如何在 Visual Studio 2013 中获取默认项目目录

java - JVMT 异常监视器

c++ - 使用unique_ptr并返回引用,或者我应该使用shared_ptr并根据需要进行复制

c - 如何在 C 中向自身添加一个 int 变量?

visual-studio-2013 - 'CPPCheck Plugin Package' 包没有正确加载

sql - 如何处理 SQL Server 2012 与 SQL (Azure) 数据库 sql 文件

c++ - 我如何解析 xsl :include directives in c++ (can't use . NET 框架)

c++ - 具有递归模板参数包函数是否为每次迭代创建特定函数?

c - 从结构体中的函数指针访问数据成员