资料
动态库与静态库: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
>>>
来源:CSDN
作者:田彼南山
链接:https://blog.csdn.net/weixin_41652700/article/details/104689362