C++与Python混合编程:Boost.Python的安装与使用(3)

libboost_python36-vc140-mt-sgd-x32-1_68.lib
| ||  | |      | |  | || ||| | | |  |
 -  ---  ------  ---  -- - -  -  --
 1  2      3      4    5 6 7  8    9

静态库以 lib 开头,动态库开头没有 lib。
所有的库都含有 boost 前缀。
Boost 库名称,本例中为 python36。
编译器名称及其版本,vc140 指的是 msvc-14.0,对应 Visual Studio 2015。
有 mt 代表 threading=multi,没有则代表 threading=single。
有 s 代表 runtime-link=static,没有则代表 runtime-link=shared。
有 gd 代表 debug 版本,没有则代表 release 版本。
目标位数,x32 代表 32 位,x64 代表 64 位。
Boost 库的版本号,1_68 代表 Boost 1.68 版本。

Boost 库的使用
如果要在项目中使用 Boost 库,需要做以下两项配置:

包含 Boost 头文件(本例中为:D:\ProgramFiles\boost_1_68_0��;
链接 Boost 库文件(本例中为:D:\ProgramFiles\boost_1_68_0\bin\lib32-msvc-14.0\lib)。

Boost 官方推荐使用 b2/bjam 命令进行自动化编译、链接,只需要编写一个 .jam 配置文件,这种方式类似于 make 和 Makefile。但考虑到还要学习 jam 语法,暂时还是用 Visual Studio 手动编译吧。
在 Visual Studio 中的具体操作如下:

选中当前项目,点击属性按钮,依次选择“配置属性->C/C+±>常规->附加包含目录”,编辑并添加一条路径:D:\ProgramFiles\boost_1_68_0;
选中当前项目,点击属性按钮,依次选择“配置属性->链接器->常规->附加库目录”,编辑并添加一条路径:D:\ProgramFiles\boost_1_68_0\bin\lib32-msvc-14.0\lib。

Boost.python 的使用
要使用 Boost.python,除了上述两项配置之外,还需要再添加两项配置:

包含 Python 头文件(本例中为:D:\Program Files (x86)\Python36-32\include);
包含 Python 静态库文件(本例中为:D:\Program Files (x86)\Python36-32\libs\python36.lib)。

在 Visual Studio 中的具体操作如下:

选中当前项目,点击属性按钮,依次选择“配置属性->C/C+±>常规->附加包含目录”,编辑并添加一条路径:D:\Program Files (x86)\Python36-32\include;
选中当前项目,点击属性按钮,依次选择“配置属性->链接器->输入->附加依赖项”,编辑并添加一个文件:"D:\Program Files (x86)\Python36-32\libs\python36.lib",注意要有双引号,否则可能识别不正确。

测试
准备 hello world 代码
使用官网给出的 hello world 示例,代码文件位于 Boost 安装目录下:D:\ProgramFiles\boost_1_68_0\libs\python\example\tutorial,包括 hello.cpp 与 hello.py 两个文件,如下:

hello.cpp:

// 当引入 #include <boost/python/xxx> 时,Boost 会默认链接 boost_python 动态链接库,
// 如果我们想要链接静态链接库,就需要在 include 之前加上 #define BOOST_PYTHON_STATIC_LIB
#define BOOST_PYTHON_STATIC_LIB

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>

char const* greet()
{
  return "hello, world";
}

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

hello.py:
import hello_ext
print(hello_ext.greet())

我们的目的是将 hello.cpp 编译成一个 .pyd 文件(其实就是一个包含 Python 接口的 .dll 文件),然后用 hello.py 调用它。
注意:hello.cpp 中的宏定义 #define BOOST_PYTHON_STATIC_LIB 非常重要,它可以指定链接 boost_python 的静态库,而不是默认的动态库。
如果你在编译过程中遇到了这样的错误:LINK : fatal error LNK1104: cannot open file "boost_python36-vc140-mt-x32-1_68.lib",但是你明明已经引入了静态库:libboost_python36-vc140-mt-x32-1_68.lib,你可能会纳闷:我明明已经导入了静态库,为什么还找我要动态库?那么最可能的原因是,你的 C++ 代码中漏掉了这句宏定义。
使用 Visual Studio 构建 hello world
Boost 官方推荐使用 b2/bjam 命令进行自动化编译、链接,只需要编写一个 .jam 配置文件,这种方式类似于 make 和 Makefile。但考虑到还要学习 jam 语法,暂时还是用 Visual Studio 手动编译吧。

首先使用 Visual Studio 创建一个空项目。
打开项目属性,在“配置属性->常规”中,进行以下修改:

配置类型设为:“动态库(.dll)”。
目标文件名设为:hello_ext。
注意:.pyd 文件的名称必须与要导出的 python module 名称一致,否则 python 的 import 语句将会报错:ImportError: dynamic module does not define module export function。
目标文件扩展名设为:.pyd。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/3f3c3fdaebfa74b00d3ce38df1100081.html