Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用外部“C”定义的VS2013 C++编译程序名称_C++_C_Visual Studio 2013_Ftdi_Extern C - Fatal编程技术网

用外部“C”定义的VS2013 C++编译程序名称

用外部“C”定义的VS2013 C++编译程序名称,c++,c,visual-studio-2013,ftdi,extern-c,C++,C,Visual Studio 2013,Ftdi,Extern C,我正在尝试构建一个WIN32控制台应用程序,该应用程序使用来自FTDI的当前2.12.28 ftd2x.lib静态库。我使用VS2013和本地非托管C++。我的电话是这样的 #include "../ftd2xx.h" . . . DWORD port_count = 0; FT_STATUS status = FT_OK; status = FT_CreateDeviceInfoList(&port_count); 当我编译时,我得到一个链接错误 GetTo

我正在尝试构建一个WIN32控制台应用程序,该应用程序使用来自FTDI的当前2.12.28 ftd2x.lib静态库。我使用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)
未解析的符号\uuu imp\uu FT_CreateDeviceInfoList@4似乎是FT_CreateDeviceInfo函数的一个损坏名称版本。因此,在使用C命名的ftd2x.lib中没有解决这个问题。我不明白的是,当ftd2x.h文件有一个条件extern C时,为什么编译器会损坏名称

#ifdef __cplusplus
   extern "C" {
#endif
. . .
FTD2XX_API
    FT_STATUS WINAPI FT_CreateDeviceInfoList(
    LPDWORD lpdwNumDevs
    );
...
#ifdef __cplusplus
}
#endif

把所有的东西都包起来???声明。我已经确认uucplusplus是在编译期间定义的。你知道是什么导致了这个意外的名字被弄乱了吗?

正如ChronoKitsune在他的评论中指出的,这里没有名字被弄乱了。问题是我链接的是FTDI库的静态版本,但是ftd2x.h头文件的默认值是声明FT_257;???函数作为对DLL版本的调用。当我将ftd2x.lib静态版本替换为ftd2x.lib DLL版本时,它成功构建。FTDI只提供一个版本的ftd2x.h头,仔细查看它的内部,我发现如果您想使用静态ftd2x.lib,您需要在包含ftd2x.h之前定义ftd2x_static

#define FTD2XX_STATIC
#include "ftd2xx.h"

这是链接错误。是否确实已将ftd2x.lib库添加到项目中?imp前缀表示函数的代码是从DLL导入的,而不是从静态库导入的,@n只是函数名的一部分,因为它使用Microsoft的u stdcall调用约定,而不是普通的C调用约定u cdecl;这就是WINAPI宏在函数声明中的含义。换句话说,这里没有C++名字的篡改,而你只是有一个正常的链接错误,大概是因为你在项目链接器设置中缺少一个库。@ TooKoSune我得出结论,在我把调用源文件从C++切换到标准C,并得到同样的错误时,它并没有名字的混乱。我正在链接静态库,但显然我使用的头文件是用于DLL版本的。我用DLL版本替换了ftd2x.lib文件,并成功编译了它。查看ftd2x.h,如果您想使用静态库,您需要在包含ftd2x.h之前定义ftd2x_static-注意-。。。后缀表示堆栈上用于输入参数的字节数,在本例中,4字节或32位参数为@4。导出的C函数不称为mangling,而是修饰。这是stdcall装饰,@4后缀表示传递参数的字节大小。它帮助链接器检测调用约定不匹配,仅在32位代码中发生。imp前缀告诉您它根本不是一个函数,而是一个变量。它在运行时指向函数,帮助OS加载程序在绑定函数时生成稍快的代码。否则,这是一个普通的旧链接器错误,总是由于忘记链接正确的库而产生,有时是由于声明错误。