c++ - C++ : Visual C++ mangles method signature differently from mangled method in dll 中 Unresolved external 问题

标签 c++ visual-c++ dll visual-studio-2012 dynamic-linking

我正在使用托管 C++ 的 Visual Studio 2012 在第三方 SDK 和我们用 C# 编写的系统之间架起一座桥梁。我已经成功包装并使用了上述 SDK 中的几个函数。除了一个,它只会导致 Unresolved external 错误。

SDK 的头文件定义了函数的签名:

#if defined WIN32
    #if defined BUILD_ADS_SHARED_LIB
        #define ADS_LINK_SPEC __declspec (dllexport)
        #define ADS_CALLING_CONVENTION __stdcall
    #elif defined USE_ADS_SHARED_LIB
        #define ADS_LINK_SPEC __declspec (dllimport)
        #define ADS_CALLING_CONVENTION __stdcall
    #else
        #define ADS_LINK_SPEC
        #define ADS_CALLING_CONVENTION
    #endif
#else
    #define ADS_LINK_SPEC
    #define ADS_CALLING_CONVENTION
#endif

DatabaseResult ADS_LINK_SPEC ADS_CALLING_CONVENTION
createDatabase(
    const Settings& settings, Artec::SdkDatabase::iDatabase *& instance);

错误说:

Error   10  error LNK2028: unresolved token (0A000089) "enum Artec::SdkDatabase::DatabaseResult __cdecl Artec::SdkDatabase::createDatabase(class Artec::SdkDatabase::Settings const &,class Artec::SdkDatabase::iDatabase * &)" (?createDatabase@SdkDatabase@Artec@@$$FYA?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z) referenced in function "private: static enum Artec::SdkDatabase::DatabaseResult __clrcall Broadway3dWrapper::Broadway3dWrapper::GetConn(wchar_t const *,wchar_t const *,wchar_t const *,wchar_t const *,char const *,class Artec::SdkDatabase::iDatabase * &)" (?GetConn@Broadway3dWrapper@1@$$FCM?AW4DatabaseResult@SdkDatabase@Artec@@PB_W000PBDAAPAViDatabase@34@@Z) C:\bioap\tfs\Identitum\Dev\src\BA.Identitum.Devices.Broadway3d\Broadway3dWrapper.obj    BA.Identitum.Devices.Brodway3D

所以它正在寻找错位的名字:

?createDatabase@SdkDatabase@Artec@@$$FYA?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z

在引用的 dll 上做了一个小转储,我发现实际上有一个函数被调用,就像导出的那样,问题是名称被破坏了,略有不同:

?createDatabase@SdkDatabase@Artec@@YG?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z

有人可以帮我吗?我无法联系到 SDK 供应商,我完全迷失在这里。

最佳答案

两者的区别在于调用约定部分。

createDatabase@SdkDatabase@Artec@@YG?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z 是标准调用:enum Artec::SdkDatabase::DatabaseResult __stdcall Artec: :SdkDatabase::createDatabase(Artec::SdkDatabase::Settings const &,class Artec::SdkDatabase::iDatabase * &)

demangler I used不理解 ?createDatabase@SdkDatabase@Artec@@$$FYA?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z,但它们不同的部分(@@$ $FYA? vs @@YG?) 是调用约定(如果我将 YG 更改为 YF,则调用约定会更改没有别的)。

将您的函数声明更改为return-type __stdcall function-name[(argument-list)]

当您包含头文件时,您是显式地还是在编译器命令行上#define USE_ADS_SHARED_LIB?您的目标是 32 位 Windows 吗?

关于c++ - C++ : Visual C++ mangles method signature differently from mangled method in dll 中 Unresolved external 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15368791/

相关文章:

visual-studio - 如何将版本号和版权嵌入到我的 DLL 中?

c++ - 为什么 push_back 签名是 void push_back (const value_type& val) 而不是 void push_back (value_type val)?

c++ - 使用UDP套接字发送时如何设置源地址

c++ - constexpr 指针值

C++ 如何将对象指针发送到函数(对指针列表进行排序)

c++ - VC++ 与 G++,cout

c++ - GDI 动画 C++ 无法正常工作

c++ - 从 MATLAB 调用 C++ .dll 库

C++11 Lambda 模板推断

c++ - 链接错误 : Missing symbol but symbol exported (in exp and lib)