在Python中调用C++,使用SWIG

来源:互联网 发布:淘宝卖袜子的店铺 编辑:程序博客网 时间:2024/04/29 22:03

SWIG:Simplified Wrapper and Interface Generator,顾名思义,就是将C/C++包装为其他高级语言的Wrapper工具,非常好用。

该项目历史悠久(创始于1995年!),且一直非常活跃,目前最新版本为2011年5月发布的2.0.4。

1、安装SWIG

wgethttp://prdownloads.sourceforge.net/swig/swig-2.0.4.tar.gztar-xzvf swig-2.0.4.tar.gzcdswig-2.0.4/#我们这里只编译Python的语言支持,可以根据你得需要加别的!./configure --without-alllang --with-python|greppythonmakesudomake install
1wgethttp://prdownloads.sourceforge.net/swig/swig-2.0.4.tar.gz2tar-xzvf swig-2.0.4.tar.gz3cdswig-2.0.4/4#我们这里只编译Python的语言支持,可以根据你得需要加别的!5./configure --without-alllang --with-python|greppython6make7sudomake install


  

2、C++代码
我们以包装一个简单的类为例子:

01#include <string>
02usingstd::string;
03 
04classMyObj
05{
06public:
07 
08    string SayHello(string name)
09    {
10        string ret("Hello, ");
11        returnret + name;
12    }
13private:
14    string id;
15};

3、编写Interface文件
SWIG需要一个intf文件,可以写的很复杂,也可以偷懒:只引用你要Wrap的.h头问件就可以啦!

01/* myobj.i */
02%module myobj
03%{
04/* 相关引用 */
05#include "MyObj.h"
06#include <string>
07%}
08 
09/* 对STL的支持 */
10%include stl.i
11 
12/* Wrapper并生成代码 */
13%include"MyObj.h"

4、生成Wrapper代码

1#生成,第一个python是目标语言,跌入个-c++是启用c++模式
2swig -python -c++ ./myobj.i
3 
4#成功的话,会生成如下文件
5myobj.i  myobj_wrap.c  myobj_wrap.cxx
6#编译,生成so文件,注意一定要用g++而不是ld做Link!!
7g++ -c myobj_wrap.c myobj_wrap.cxx -I /usr/include/python2.6/
8g++ -shared myobj_wrap.o -o myobj.so

5、测试

1>>>importmyobj
2>>> o = myobj.MyObj()
3>>> o.SayHello("ICT")
4'Hello, ICT'
5>>>

6、补充

如果你想使用复合类型,例如vector<string>,请务必在.i文件中声明!

1namespacestd{
2%template(VectorOfString) vector<string>;
3}
原创粉丝点击