我在使用用SWIG接口导出的.dll
共享库中的函数时遇到问题。
大图片是:我在Linux下用C++开发了一些代码,用SWIG包了起来。在Linux下,我将C++源编译成了^ {< CD2> }对象,并在Python中使用了^ {CD2}库。Version Info
Python: 2.6.4
Swig: 2.0.4
现在,我需要将所有这些函数迁移到windows,windows中.so
的等效函数是.dll
。因此,我计划将所有C++源代码编译成^ {< CD1}},并通过Python访问它们。
有一个使用SWIG生成的巨大的.cxx
源文件,其中包含我开发的所有函数。现在的任务是将这个SWIG生成的文件编译成一个.dll
,以便以后可以使用所有函数。然而,cxx文件使用了一些奇怪的方式来包装我的所有函数,我不知道如何使用它们。
函数包装如下。SSEI有一个C++类,叫做^ {CD10>},在包装后,类成为^ {CD8>}文件中的函数,并定义如下:
SWIGINTERN PyObject *_wrap_sdrts_reverse_burst_ff_sptr___deref__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
boost::shared_ptr< sdrts_reverse_burst_ff > *arg1 = (boost::shared_ptr< sdrts_reverse_burst_ff > *) 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject * obj0 = 0 ;
sdrts_reverse_burst_ff *result = 0 ;
if(!PyArg_UnpackTuple(args,(char *)"sdrts_reverse_burst_ff_sptr___deref__",1,1,&obj0)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_boost__shared_ptrT_sdrts_reverse_burst_ff_t, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sdrts_reverse_burst_ff_sptr___deref__" "', argument " "1"" of type '" "boost::shared_ptr< sdrts_reverse_burst_ff > *""'");
}
arg1 = reinterpret_cast< boost::shared_ptr< sdrts_reverse_burst_ff > * >(argp1);
result = (sdrts_reverse_burst_ff *)(arg1)->operator ->();
resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sdrts_reverse_burst_ff, 0 | 0 );
return resultobj;
fail:
return NULL;
}
这还不是全部:在这个.cxx
文件的末尾有一个巨大的数组,它包含所有类函数,如下所示:
我沿用了我以前使用.dll
s的经验,并用一个简单的__declspec(dllexport)
头导出了所有函数。在Python中,我还可以调用导出的_wrap_sdrts_reverse_burst_ff_sptr___deref__
:
import ctypes
_dll_func_list = ctypes.WinDLL("func.dll")
_reverse_burst_ref = _dll_func_list._wrap_sdrts_reverse_burst_ff_sptr___deref__
不过,这是我能接近的最远的距离。例如,当我试图访问该类中的子函数时
_class_ref._wrap_sdrts_reverse_burst_ff_sptr_set_reverse_burst(0)
该死的机器告诉我:
'_wrap_sdrts_reverse_burst_ff_sptr_set_reverse_burst' cannot be found.
当我尝试直接调用函数并传入如下参数时:
_dll_func_list ._wrap_sdrts_reverse_burst_ff_sptr_set_reverse_burst(0)
机器说
WindowsError: exception: access violation reading 0x00000004
有人知道如何使用Python访问SWIG包装的导出函数吗?
除了.cxx文件外,SWIG还生成一个.py文件。一旦在平台上构建了一个DLL(或共享对象),在Python中使用它所需做的就是
其中
ModuleName
是您告诉SWIG调用该模块的内容,可以通过.i文件中的%module
在调用该模块时从命令行执行。在在SWIG生成的Python中,有一些代码可以为您处理DLL的加载-不需要使用ctypes或类似的东西。生成的代码与您在SWythPython中尽可能紧密地封装的SHIG接口相匹配,并神奇地将调用关闭到C++侧。在
因此,如果
^{pr2}$sdrts_reverse_burst_ff
是一个自由函数,则可以执行以下操作:您需要确保使用SWIG期望的名称来构建DLL—从Python引发的异常中可以很明显地看出,如果不是这样的话。您可能还希望将它与包含
sdrts_reverse_burst_ff()
的实现相链接,除非这是一个只包含头的函数。在_my_dll.so
简单地将.dll文件重命名为.pyd就可以了,但最好还是构建它,正如上面的注释所指出的那样。在
相关问题 更多 >
编程相关推荐