通过boost库实现将c++封装成python包

家住魔仙堡 提交于 2020-03-08 02:36:58

资料
动态库与静态库:https://blog.csdn.net/wonengguwozai/article/details/93195827

第一部分 boost的下载与安装
1、从官网上下载boost库的压缩包
官网地址:https://www.boost.org/
·可以下载最新版本,注意自己电脑的系统选正确

2、编译boost
(1)解压boost文件
(2)命令行运行bootstrap.bat
·运行完成后会产生一个b2.exe文件
(3)命令行运行b2.exe
·等待一段时间,在命令行的最后获得提示要将两个地址放入环境。

3、配置环境
(1)注意是32位机还是64位
·根据之前命令行结尾的提示
(2)在项目 -> vc++目录 -> 包含目录 添加解压包的地址
(3)在项目 -> vc++目录 -> 库目录 添加静态库的地址
(4)在项目 -> vc++目录 -> 包含目录 添加Anacond的include
(5)在项目 -> vc++目录 -> 库目录 添加Anconda的libs

4、添加头文件
·#include “boost/python.hpp”
·编译后会显示报错
错误 LNK1104 无法打开文件“boost_python37-vc141-mt-gd-x64-1_72.lib”

5、添加宏定义就可解决
·因为boost默认打开动态库所以无法打开静态库的文件,通过以下宏定义改成静态库
#define BOOST_PYTHON_STATIC_LIB

第二部分 boost库的封装使用
1、环境配置
(1)按照第一部分配置环境
·其实就是看缺什么添什么

2、生成dll项目
·因为最终是将dll文件修改为pyd文件,所以创建dll项目然后生成dll文件
在这里插入图片描述
3、示例代码
代码主要来源于:https://blog.51cto.com/11293981/2155041
照搬之后编译有问题,略作修改

#include <iostream>
#include <string>
#define BOOST_PYTHON_STATIC_LIB
#include <boost/python.hpp>   // 必须引入这个头文件

using namespace boost::python;

class HelloWorld {
public:
 HelloWorld(const std::string& name, int age);
 void printInfo();
 
private:
 std::string m_name;
 int m_age;
};

HelloWorld::HelloWorld(const std::string& name, int age) :m_name(name), m_age(age) {
}

void HelloWorld::printInfo() {
 std::cout << "我叫" << m_name << ", " << m_age << "岁了" << std::endl;
}

void ceshi() {
 std::cout << "ceshi" << std::endl;
}

BOOST_PYTHON_MODULE(Dll2) //这里的Dll2要和项目名一致,并且是之后python包的名字
{
 //类的封装
 class_<HelloWorld, boost::noncopyable>               //第一个参数是c++中要封装的类,第二个是封装模式
  ("helloworld", init<const std::string&, int>())  //第一个参数是封装后python调用时的名字,第二个参数是构造函数的参数类型
  .def("printinfo", &HelloWorld::printInfo);       //定义类中函数,前面是python调用的名字,后者是c++中函数的地址
 
 // 普通函数的封装
 def("ceshi", &ceshi);                                //同上
}

4、python测试
(1)将生成的dll文件重命名为pyd文件
(2)测试结果如下
·先把地址转换到Dll2.pyd所在地址,或者把地址放入python的搜索路径中,进入python。

>>> import Dll2
>>> test = Dll2.helloworld("wang",22)
>>> test.printinfo()
我叫wang, 22岁了
>>> Dll2.ceshi()
ceshi
>>>       
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!