Fab*_*ter 0 c++ dll dynamic-linking visual-c++ visual-studio-2012
我正在使用Visual Studio 2012,托管C++,在第三方SDK和我们用C#编写的系统之间建立桥梁.我成功地包装并使用了SDK中的几个函数.除了一个,只会导致未解决的外部错误.
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);
Run Code Online (Sandbox Code Playgroud)
错误说:
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
Run Code Online (Sandbox Code Playgroud)
所以它正在寻找受损的名称:
?createDatabase@SdkDatabase@Artec@@$$FYA?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z
Run Code Online (Sandbox Code Playgroud)
在引用的dll上制作一个小的dumpbin,我发现实际上有一个叫做导出的函数,东西的名字略有不同:
?createDatabase@SdkDatabase@Artec@@YG?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z
Run Code Online (Sandbox Code Playgroud)
有人能帮我一下吗?我无法联系SDK供应商,我完全迷失在这里.
这两者之间的区别在于调用约定部分.
createDatabase@SdkDatabase@Artec@@YG?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z 是stdcall: enum Artec::SdkDatabase::DatabaseResult __stdcall Artec::SdkDatabase::createDatabase(class Artec::SdkDatabase::Settings const &,class Artec::SdkDatabase::iDatabase * &)
在我用demangler不明白?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位窗口?
| 归档时间: |
|
| 查看次数: |
1105 次 |
| 最近记录: |