目前需要将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
>>>