Visual studio 2012 为什么编译器要装饰一个extern;";作为C++;功能?

Visual studio 2012 为什么编译器要装饰一个extern;";作为C++;功能?,visual-studio-2012,c++-cli,linker-errors,Visual Studio 2012,C++ Cli,Linker Errors,链接器给了我以下错误: 错误27错误LNK2028:未解析的令牌(0A0003C0)“外部“C”int __cdeclInitDSPs(void)“(?InitDSPs@$$J0YAHXZ)在函数“public:static unsigned int”中引用 HikInterface::HikController::InitializeDSPs(枚举 HikInterface::视频标准) (?InitializeDSPs@HikController@HikInterface@@$$FSMIW4

链接器给了我以下错误:

错误27错误LNK2028:未解析的令牌(0A0003C0)“外部“C”int __cdeclInitDSPs(void)(?InitDSPs@$$J0YAHXZ)在函数“public:static unsigned int”中引用 HikInterface::HikController::InitializeDSPs(枚举 HikInterface::视频标准) (?InitializeDSPs@HikController@HikInterface@@$$FSMIW4VideoStandard@2@@Z)

正如你所看到的,链接器似乎期待C++风格的装饰函数,忽略了<代码>外部“C”< /代码>链接规范。strong>这只发生在64位构建上;32位版本编译得非常好。

我已经检查了要链接的64位.lib文件的导出符号,它们没有按照预期进行修饰,就像32位.lib文件一样。我还确信项目是根据正确的.lib文件链接的

下面是如何在头文件上声明有问题的函数

#define DLLEXPORT_API  extern "C" __declspec(dllexport) 
...
DLLEXPORT_API int __stdcall InitDSPs();
(我已经尝试为
dllimport
切换
dllexport
,因为此项目正在使用DLL,但错误保持不变)


有什么线索或建议吗?

这只是链接器中的一个怪癖,特定于C++/CLI代码。实际签名可以。好吧,除了
\uu stdcall
\uu cdecl
之间的明显不匹配之外,您还必须修复这个问题。当然,只找到一个DLLeutter声明不能正确,在另一个地方,你是正确的。HANSPASANT,我切换到32位构建,并从链接器输入中删除.LIB以强制错误,并且它也显示了修饰的C++签名。如果您将您的评论作为答案发布,我们将很乐意接受。@HansPasant,原来供应商在他们的64位SDK上打包了一个32位的构建,再次感谢!这只是链接器中的一个怪癖,特定于C++/CLI代码。实际签名可以。好吧,除了
\uu stdcall
\uu cdecl
之间的明显不匹配之外,您还必须修复这个问题。当然,只找到一个DLLeutter声明不能正确,在另一个地方,你是正确的。HANSPASANT,我切换到32位构建,并从链接器输入中删除.LIB以强制错误,并且它也显示了修饰的C++签名。如果您将您的评论作为答案发布,我们将很乐意接受。@HansPasant,原来供应商在他们的64位SDK上打包了一个32位的构建,再次感谢!