申明:本人仅在以下条件下进行测试,其他的环境或者版本并未做更多测试。
为什么写这个博客?
本人由于近期需要用到C++和python的混合编程,需要在python里面调用C++,要用到boost.python库,奈何网上都是基于python2的教程,没有python3的。由于python2和python3的不兼容,因此python3不能直接使用python2的库(已测试,确实会出错),经过多番探索,最终解决该问题,希望发表出来能给其他人带来便利。
好,下面上干货。
1.测试条件
windows7 64位
python3.5
VS2015 (V140版本)
boost 1.66.0
2.准备工作
说明:boost官网的第三方lib文件是针对Python2的,没有python3,因此我们需要下载源码用python3进行编译生成。
进入官网http://www.boost.org/,选择最新的版本,这里是1.66.0版本,如下图所示。
点击进入
我选择的是.ZIP的,下载即可。
下载完成之后,解压,我放到D盘。路径为:D:\boost_1_66_0。
下面进入非常关键的编译环节。
3.boost的编译
编译的过程我参考的这篇博文http://blog.csdn.net/lianbus/article/details/46230357,下面再进行详细说明一下。
(1)首先,查看VS的版本,方法如下:
右键-->属性 即可。
可以看出,我的VS2015是V140的,记住这个140这个数字。
(2)从开始菜单打开 VS的命令提示符。
(3)从终端进入boost库所在目录,如D: \boost_1_66_0。
(4)运行bootstrap.bat生产64位的bjam.exe,这个bjam将用于后续的编译过程。
步骤(3)和(4)操作如下:
bjam.exe将用于之后的lib文件的产生,进入boost目录即可查看文件是否生成成功。
(5) 进行编译,生成lib文件。
是否还记得前面我的VS2015的版本是V140,下面代码里msvc-14.0中14.0就是我的版本号,根据自己的情况进行更改。编译又有两种方式,静态的(static)和动态的(shared)。动态的库配置需要复制对应的dll到python目录下,这里不做讲解,仅讲解动态库的配置。
继续在窗口里输入
静态的库:
直接输入,bjam toolset=msvc-14.0 --with-python threading=multi link=static address-model=64。
(说明:--with-python 里面的python需要是python3版本,要求系统能找到你的python,直接在cmd里面输入python能弹出python3说明没有问题)
编译完成如下:
在boost目录下会生成stage文件夹,里面的lib就是C++所需的python3的lib文件。可以将Lib复制出来,放到指定的文件夹,我这里是将static的库放到新建的lib_static文件夹下,将用于后续的配置。
1. 分别包含boost 和python3对应的include和lib.
(1)配置包含目录
2.代码设置和编译成dll
(1)由于使用的是静态库,首先需要在你的c++文件前加上下面这句(我是放到头文件的):
#define BOOST_PYTHON_STATIC_LIB
(2)并在头文件中并包含和命名空间。
#include
using namespace boost;
using namespace boost::python;
(3)封装类和函数。
void ReconstructionData::hello()
{
cout << "hello, this is my example!" << endl;
}
void ReconstructionData::print()
{
cout << "print!" << endl;
}
BOOST_PYTHON_MODULE(mysample)
{
class_
.def("hello",&ReconstructionData::hello)
.def("print",&ReconstructionData::print); //注意以分号结尾
}
其中 mysample 是模块的名字,CLassName是类名,hello 和print是类的成员函数名。在Python里面调用就简单了,和通常的库调用方式是一样的。
(4)编译成dll
打开 工程属性 —> 配置属性 —> 常规,在右侧的 项目默认值—> 配置类型中选择“动态库(.dll)”,这将使 VS 生成 dll 动态库文件,而非 exe 可执行文件。
选择 生成 —> 生成解决方案。生成 .dll文件后,将名字改为mysample,后缀名改为pyd。将该文件复制到Python 的库目录下(python —>lib —>site-packages),然后 从python中Import进去就OK啦。
cmd进入python,import mysample库。
申明一个对象:s=mysample.ReconstructionData()
s.hello()
到此处,终于大功告成!