(以下是基于VS2015 x64的boost.python环境搭建)
(也适用于编译不同python版本的boost.python问题,boost1.61默认是2.7版的python)
环境搭建
软件:
VS2015(包含C++编译环境)
64位Python 3.6
boost 1.61
安装:
略
boost.python动态编译库的编译
首先,去boost官网下载boost源码库,并将其解压到一个目录:D:\ThirdParty\boost_1_61_0。
然后,编译boost 的编译器 bjam.exe;使用VS2015提供的开发人员工具编译bjam.exe,先把cmd管理员身份运行的目录切换到D:\ThirdParty\boost_1_61_0\tools\build,执行bootstrap.bat文件进行编译,如下图所示。
然后再修改bjam的配置文件;在D:\ThirdParty\boost_1_61_0\tools\build\example目录下,打开user-config.jam配置文件,修改两处,一个是msvc版本,另一个python安装路径和版本。
因为VS用的是2015版本,所以msvc为14.0,并设置python的包含目录和库目录。在boost整体的编译过程中会使用python的2.7版本进行编译,需要使用其他版本的boost.python就需修改默认参数。执行bjam.exe编译命令
将刚才的bjam.exe 拷贝到 D:\ThirdParty\boost_1_61_0下,准备boost 库的编译。将命令提示符定位到 D:\ThirdParty\boost_1_61_0下,执行 bjam 编译命令。(建议在执行前先看一下后面关于bjam命令中各个参数的含义)
a. 编译release版本(x64)
bjam --with-python --prefix=c:\boost stage toolset=msvc-14.0 variant=release link=shared address-model=64 threading=multi runtime-link=shared install
b. 编译debug版本(x64)
bjam --with-python --prefix=c:\boost stage toolset=msvc-14.0 variant=debug link=shared address-model=64 threading=multi runtime-link=shared install
注指令参数:
–prefix设置boost安装目录;
stage表示只生成库文件(dll与lib文件);
toolset指定编译器
variant决定编译什么版本;
link决定使用静态库还是动态库,shared是动态库,static是静态库;
address-model决定地址长度,即32还是64位程序;
threading决定使用单线程(single)还是多线程(multi)库;
runtime-link决定是静态(static)还是动态(shared)链接C/C++标准库;
install会生成包含头文件的include目录。
测试
在VS2015中,新建win32控制台工程,配置Release,平台为x64。并配置python和boost的包含路径和库路径。
C++代码:
#include<iostream>
#include<boost\python.hpp>
#include<Python.h>
using namespace std;
using namespace boost::python;
int main()
{
Py_Initialize(); // 检查初始化是否成功
if (!Py_IsInitialized())
{
return -1;
}
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
object mainModule;
object mainNamespace;
try
{
mainModule = import("__main__");
mainNamespace = mainModule.attr("__dict__");
//要求simple.py与可执行文件在相同路径下! 运行ok
object simple = exec_file("example.py", mainNamespace, mainNamespace);
//object result = exec_file("simple.py", global, global);
object foo = mainNamespace["foo"];
int val = extract<int>(foo(5));
object add = mainNamespace["add"];
string url = extract<string>(add("abc"));
cout << "Python has caculated add as " << val << endl;
cout << "Python has caculated foo as " << url << endl;
}
catch (...)
{
if (PyErr_Occurred())
PyErr_Print();
}
// 关闭Python
Py_Finalize();
system("pause");
return 0;
}
python代码:
# example.py
def add(i=4):
return i+2008
def foo(url):
return url
运行结果如下图:
* 注:1). 报运行时缺少boost_python3-vc140-mt-1_60.dll动态库文件时,解决办法把boost_python3-vc140-mt-1_60.dll拷贝到项目中执行文件exe同级目录下。