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

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

1、安装SWIG


1234567

wget http://prdownloads.sourceforge.net/swig/swig-2.0.4.tar.gztar -xzvf swig-2.0.4.tar.gzcd swig-2.0.4/#我们这里只编译Python的语言支持,可以根据你得需要加别的!./configure --without-alllang --with-python|grep pythonmakesudo make install


2、C++代码

我们以包装一个简单的类为例子:


123456789101112131415

#include <string>using std::string; class MyObj{public:     string SayHello(string name)    {        string ret("Hello, ");        return ret + name;    }private:    string id;};


3、编写Interface文件

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


1234567891011121314151617

/* myobj.i */%module myobj %{ /* 相关引用 */#include "MyObj.h"#include <string>%}  /* 对STL的支持 */%include stl.i  /* Wrapper并生成代码 */%include "MyObj.h"


4、生成Wrapper代码


12345678

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


5、测试


12345

>>> import myobj>>> o = myobj.MyObj()>>> o.SayHello("ICT")'Hello, ICT'>>>


6、补充

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


1234

namespace std{%template(VectorOfString) vector<string>; }