swig issue

以下是我在用swig将c++代码转换成c#时遇到的几个典型的问题及解决方法。

(注:c++方我只有.dll跟.h 无法修改源代码)

1. Syntax error in input.

 如果源代码里有__declspec(dllexport) ,就会出现这个错误,这是因为__declspec(dllexport)不是标准c++语法,SWIG只解析ISO c/C++所以无法处理__declspec(dllexport)

解决方法: 在.i文件里添加%include <windows.i>

There is a Windows interface file, windows.i, to deal with these calling conventions though. The file also contains typemaps for handling commonly used Windows specific types such as __int64, BOOL, DWORD etc. Include it like you would any other interface file

 

2. 引入“Finalize”方法会妨碍析构函数调用。您是要声明析构函数吗?

错误 CS0111: 类型“SG_USER_DYNAMIC_DATA”已定义了一个名为“Finalize”的具有相同参数类型的成员

在c++转c#时,由于c++里自定义的Finalize函数与c#里的Finalize冲突,导致出现这个错误。

解决办法: 改c++源文件里的函数名或者在接口文件里用%rename

%rename(finalize) Finalize;

 

3.  在使用swig转好的c#版时,当把父类对象转换成子类对象时出现运行时错误。

解决方案:可以看一下swig目录下CHANGES文件,搜索DYNAMIC_CAST, Examples\test-suite下有一个dynamic_cast.i,里面有DYNAMIC_CAST的example.

这里简单摘要一下: 

%typemap(out) Foo *blah {

    Bar *downcast = dynamic_cast<Bar *>($1);

    *(Bar **)&$result = downcast;

}

%typemap(csout, excode=SWIGEXCODE) Foo * {

    Bar ret = new Bar($imcall, $owner);$excode

    return ret;

  }

 

欢迎讨论 。

原文链接: https://www.cnblogs.com/cnicefire/archive/2010/07/24/1784130.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    swig issue

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/13053

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午12:18
下一篇 2023年2月7日 下午12:18

相关推荐