SWIG(Simplified Wrapper and Interface Generator)是一个为C/C++库提供脚本调用支持的工具,支持Lua, Perl, Python, Go等多种脚本语言。如果不了解可以参考Interfacing C/C++ and Python with SWIG。本文主要关注在SWIG Python中如何实现绑定已有C++实例,想象一下,调试时如果可以不用重新编译C++程序,使用脚本动态调用C++,该是有多方便。SWIG文档31.3.5 Pointers小节中明确提到
However, the inverse operation is not possible, i.e., you can't build a Swig pointer object from a raw integer value
官方是不提供支持的,但是仔细看一下SWIG代码会发现并不难实现。
首先,我们来看一下SWIG是如何对C++类进行封装的,定义一个简单的测试类:
#ifndef FOO_H__#defineFOO_H__classFoo
{public:
Foo();intGetNum();voidSetNum(intnum);private:intm_num;
};#endif//FOO_H__
Foo.cpp
#include"Foo.h"Foo::Foo()
: m_num(-1)
{
}intFoo::GetNum()
{returnm_num;
}voidFoo::SetNum(intnum )
{
m_num=num;
}
接口文件:
%module foo%{
#include"Foo.h"%}classFoo
{public:
Foo();intGetNum();voidSetNum(intnum);private:intm_num;
};
调用命令:swig -c++ –python Foo.i生成wrapper文件,然后使用distutils编译成_foo.so:
from distutils.core import setup, Extension
setup(name="foo", version="1.0", ext_modules=[Extension("_foo", ["Foo_wrap.cxx","Foo.cpp"],
extra_compile_args=['-