目前需要将c++ 接口被python调用,在网上找发现有一个工具swig可以实现这个功能。关于swig大家可以去网上了解,这里就不做过多介绍,本文主要是给出一个完整的例子。因为我发现网上给出的例子大多不可用,或有些地方说的不明白
1.首先要在linux下安装swig工具,大家可以输入swig命令按提示安装(ubuntu)
2.写一个c++的接口类
//example.h #ifndef EXAMPLE_H #define EXAMPLE_H class Math { public: int pi() const; void pi(int pi); private: int _pi; }; #endif
//example.cpp #include "example.h" int Math::pi() const { return this->_pi; } void Math::pi(int pi) { this->_pi = pi; }
3. 接下里我们需要一个.i文件用来转换接口的
//example.i %module example %{ #define SWIG_FILE_WITH_INIT #include "example.h" %} %include "example.h"
其中 example 是模块名字,可以被python导入的。大括号内的是会被写到生成文件里,是你需要的头文件,最后一个
%include "example.h"
是要遍历的接口(不需要你都列出来 他会根据.h文件扫描)
4. 我们现在要将接口导出成python的接口
swig -python -c++ example.i
-python :是目标语言
-c++ : 是接口源语言
5. 如果不报错 可以看到多出来2个文件 example.py 和 example_wrap.cxx
接下来编译:
g++ -c example.h example.cpp example_wrap.cxx - I /usr/include/python2.7/
其中
/usr/include/python2.7/
是去找 python.h 这个文件,通过安装 python-dev可以获得
6. 最后一步是生成python的可以导出的包
g++ -shared example.o example_wrap.o -o _example.so
记住
_example.so
名字一定不能是
example.so
否则python导入模块时会出错。
最后测试在终端输入 python 进入python的解释器
>>> import example >>> obj = example.Math() >>> print obj.pi() 0 >>> obj.pi(10) >>> print obj.pi() 10 >>>