利用boost将C++程序生成动态链接库供Python程序调用

利用boost将C++程序生成动态链接库供Python程序调用

C++的运行效率要比Python高许多,本文实现使用C++编写Python扩展
环境:Python3,Ubuntu16.04;简单实现一个求最大公约数的类;生成的是so文件,仅供Linux系统使用

1.准备

(1)安装相关依赖
sudo apt-get install libboost-all-dev
sudo apt-get install python-dev
(2)相关文件

在同级目录下建立三个文件:GCD.cpp,Makefile,Untitle.ipynb
在这里插入图片描述

2. 编写C++代码

#include <boost/python.hpp>
#include <iostream>
#include <string>
using namespace boost::python;\\注意命名空间
class GCD
{
private:
    std::string name;
public:
    int gcd(int a,int b); \\声明成员函数
    GCD(const std::string s);
    std::string introduce();
};

GCD::GCD(const std::string s) \\此函数封装之后相当于Python中的init()
{
    this->name = s;      \\简单实现为私有变量赋值功能
}
int GCD::gcd(int a,int b) \\计算最大公约数
{
    {
        int t;
        t=a%b;
        if(t==0)
        {
            return b;
        }
        else
        {
            return gcd(b,t);
        }
    }
}
std::string GCD::introduce() \\调用私有变量
{
    std::string myname = this->name;
    return "my name is "+myname;
}
//主要加入以下代码,将C++类封装为Python模块
BOOST_PYTHON_MODULE(GCD) //so文件名
{
    class_<GCD>("GCD", init<const std::string>()) // 尖括号里的为C++类名,双引号里为函数名,init里面就是放构造函数的参数
    .def("introduce",&GCD::introduce)
    .def("gcd", &GCD::gcd); //导出类中的方法
    //def("only4test",&only4test); //普通函数导出
}

3. 编译

(1)编写Makefile
CC = g++
CFLAG = -fPIC -std=c++11 -I. -I/usr/include/python3.5m  #这里的路径和下面一行根据自己的情况
LIBS = -lboost_python-py35 -lpython3.5m
TARGET = GCD.so #目标文件(.so文件)
SRC = GCD.cpp #源文件(待编译的.cpp文件)
$(TARGET): $(SRC)
    $(CC) -shared -o $@ $^ $(CFLAG) $(LIBS) #前面为Tab,不能用空格
(2)编译

终端键入

make

即可生成os文件
在这里插入图片描述在这里插入图片描述

4.测试

打开jupyter notebook,测试以下代码

import GCD

test = GCD.GCD("test0")
info = test.introduce()
print(info)

res = test.gcd(27,45)
print(res)

结果如图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值