SWIG c++ 到 C# 错误无法找到入口点 SWIGRegisterExceptionCallbacks_xxxx

Posted

技术标签:

【中文标题】SWIG c++ 到 C# 错误无法找到入口点 SWIGRegisterExceptionCallbacks_xxxx【英文标题】:SWIG c++ to C# error unable to find entry point SWIGRegisterExceptionCallbacks_xxxx 【发布时间】:2018-05-03 14:59:51 【问题描述】:

所以我得到了这个简单的 C++ 代码,我尝试使用 swig 3.0.2 进行包装以生成 C# 等效项。

这里是c++代码

myclass.hpp

#ifndef __MYCLASS__
#define __MYCLASS__

class myclass 
public:
    int add(int b, int c);
;

#endif

myclass.cpp

#include "myclass.hpp"

int myclass::add(int a, int b) 
    return a+b;

myclass.i

%module mymodule

%
#include "myclass.hpp"
%

%include "myclass.hpp"

所以这里是 swig 命令

swig -csharp -c++ -outdir csharp myclass.i

这里是使用MinGW的编译命令

g++ -shared -I./ myclass_wrap.cxx myclass.cpp -o mymodule.dll

然后我尝试在控制台应用程序中使用 swig 生成的代码,我收到以下错误:

找不到名为的入口点 DLL“mymodule”中的“SWIGRegisterExceptionCallbacks_mymodule”。

所以它正确加载了 mymodule.dll,但找不到 SWIGRegisterExceptionCallbacks_mymodule,这看起来很奇怪......它出现在 myclass_wrap.cxx 中,似乎是正确的导出关键字__declspec(dllexport)

谢谢你的帮助,

干杯

【问题讨论】:

【参考方案1】:

所以我找到了问题,因此遇到相同问题的其他人可以找到解决方案。

在编译器中添加-add-stdcall-alias 解决了这个问题:

g++ -shared -I./ myclass_wrap.cxx myclass.cpp -o mymodule.dll -add-stdcall-alias

使用 DLL 资源管理器查看器软件时,我注意到函数以 MyFunctionName@XX 结尾,我相信这会导致 entrynotfoundexception,因为它正在寻找 MyFunctionName 而不是 MyFunctionName@XX

所以 swig 使用 __stdcall 生成了 c 代码,而 MinGW 在 __stdcall 中生成了那些 MyFunctionName@XX

更多信息可以在这里找到:http://wyw.dcweb.cn/stdcall.htm

干杯,

【讨论】:

以上是关于SWIG c++ 到 C# 错误无法找到入口点 SWIGRegisterExceptionCallbacks_xxxx的主要内容,如果未能解决你的问题,请参考以下文章

“无法在 dll 中找到名为 [function] 的入口点”(c++ 到 c# 类型转换)

无法在 DLL 中找到入口点

无法找到入口点 (cpp)

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?

System.EntryNotFoundException:无法在 DLL 中找到入口点

无法使用 SWIG 在 Python 中实例化 C++ 类(获取属性错误)