现在的位置: 首页 > 综合 > 正文

python 调用c++接口

2013年06月26日 ⁄ 综合 ⁄ 共 1077字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.