32位汇编语言helloworld_Boost::Python 入坑随笔 (一) : 编译安装及Hello World(。???)ノ

15673108fe3398261cfdaab64b857cc9.png
  • Boost::Python 入坑随笔 (一): 编译安装及 Hello World ! (。・∀・)ノ
    • 前言
    • 环境
    • 编译 Boost 库
      • 创建 user-config.jam 文件
      • 编译
        • b2 / bjam 部分命令参数说明
    • 使用及测试
      • 创建项目并配置 Boost::Python
      • 测试 Hello Boost Python
    • 引用及参考

前言

Boost::Python 是 C++ Boost 库中的一个与 Python 交互的模块。Boost 这个库本身有多么神奇就不必多说了,我们还是来谈谈 Boost::Python。 Python 本身就有一个很好的 Python / C API,可用于 Python 与 C / C++ 的交互。例如用 C++ 编写一个模块,然后 Python 来调用该模块。这种方式既能在保证性能的前提下,又不失 Pythonic,何乐而不为呢。

Python 之禅 优美胜于丑陋 ( Python 以编写优美的代码为目标 ) 明了胜于晦涩 ( 优美的代码应当是明了的,命名规范,风格相似 ) 简洁胜于复杂 ( 优美的代码应当是简洁的,不要有复杂的内部实现 ) 复杂胜于凌乱 ( 如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁 ) ...

而 Boost::Python 就是一个高度封装好的 Python / C API,它能简化 C++ 代码,使得为 Python 编写 C++ 扩展更为简单方便。甚至还能以 OOP 风格在 C++ 中编写 Python 对象的操作。Pythonic 即为正义 ╰( ̄ ω  ̄o)。因此,我也开始了我的 Boost::Python 入坑之旅。


环境

先说说我的环境配置:

  • Windows 10 64 bit
  • Anaconda Python 3.7.2 ( 64 bit )
  • Visual Studio 2017 ( msvc v14.16 )
  • Boost 1.69

注 : VS 2017Boost 1.69 就大家自己去下载吧。


编译 Boost 库

编译应该是我踩坑过程当中遇到的最为繁杂的一步了,好在现在已经轻车熟路。不要慌,一步一步来。实际上 Boost 较早一些的版本是提供了 Windows 预编译二进制包的,比如 Boost 1.67。但是它里边编译好的是 Python 2.7 的,所以想要自己对应 Python 版本的 Boost::Python,还是得自己编译 ( ̄ ▽  ̄)"

创建 user-config.jam 文件

解压之前下载好了的 boost_1_69_0.zip ( or boost_1_69_0.7z ) 文件。打开解压好的 boost_1_69_0 文件夹,在该文件夹下新建一个 user-config.txt 文件,并在里边加上几句:

using msvc : 14.1;

# 路径仅供参考
using python    : 3.7
        : "C:Usersuser nameAnaconda3python.exe"
        : "C:Usersuser nameAnaconda3include"
        : "C:Usersuser nameAnaconda3libs" ;

其中 using msvc : 14.1 指定编译器为 msvc 14.1 即 VS 2017,如果是 VS 2015 的话应填 using msvc : 14.0using python 则是指定 Python 版本及其路径,因为我用的是 Anaconda Python 3.7.2,所以第一处填 3.7,第二处则是 Anaconda 根目录下的 python.exe 的目录。第三四处也都在 Anaconda 根目录下,注意顺序和符号填进去就行了。切记版本号和路径填你自己的,别只复制粘贴。保存 user-config.txt 文件后并将其后缀修改为 .jam ,即 user-config.jam

编译

Boost 库提供了强大的编译工具 b2.exebjam.exe ,其中 b2.exe 为新版本的编译工具,我们使用它来编译 Boost::Python 64 位静态库。在 boost_1_69_0 文件夹下打开命令行 ( Powershell 等),输入以下命令回车即可。

.b2 --with-python --prefix="g:boost" install toolset=msvc-14.1 link=static address-model=64

该指令会同时编译 ReleaseDubug 版本,若要单独编译某一个版本,则可使用以下指令:

  • Release 版
.b2 --with-python --prefix="g:boost" install toolset=msvc-14.1 variant=release link=static address-model=64
  • Dubug 版
.b2 --with-python --prefix="g:boost" install toolset=msvc-14.1 variant=debug link=static address-model=64

注:由于还要复制各种头文件,所以总耗时大概 10 ~ 20 min。

b2 / bjam 部分命令参数说明

  • --with- | --without- --with- 后面接要编译的 Boost 的库名,如 --with-python 即仅编译 Boost::Python 库。相对的,--without-python 即为编译除 Boost::Python 之外全部库。如果要编译 ( 或不编译 ) 多个库的话,可用多条 with | without 语句来指定,缺省则为全部编译。
  • install | stage stage 即只生成库,而 install 还会生成 include 目录。通过 --prefix="g:boost" 指定 install 生成好的库的路径为 "g:boost"。如果是 stage 则由 --stagedir= 来指定。
  • toolset 指定编译工具,此处我们指定为 msvc 14.1,即 VS 2017 的编译器
  • link 即指定编译为动态库还是静态库 ( .dll | .lib ),shared 即编译为动态库,static 即为静态库,不填则默认编译为静态库。一般而言静态库体积要大一些,但不用带 Boost::Python 的 DLL 文件,部署和使用也较为方便; 动态库的话相对体积较小(也小不了多少),但必须用带 Boost::Python 的 DLL 文件。选择静态库还是动态库这个得自己取舍。 ( 小孩子才做选择,我全都要( •̀ ω •́ )✧ )
  • address-model 指定编译为 32 位还是 64 位,我们指定 address-model=64 即编译为 64 位。

使用及测试

编译好后怎么能少的了来一个 Hello World! 呢?常言道:" 没有经过 Hello World! 洗礼的代码是没有灵魂的!"。

走起 ヾ(•ω•`)o

创建项目并配置 Boost::Python

打开 VS 2017 并创建一个 C++ 空项目 HelloBoostPython

19907c2d35c3afae67d6d48180bc87fb.png

将工具栏那的改为 Release x64

6ef5364d77b90176a095d4c48955c00f.png

接下来打开项目属性,即解决方案管理器中选择该项目 右键->属性

efdb852e5be22eccb62989b23ec64cdf.png

在 配置属性->常规 中修改目标文件名( Hello_Boost )及其扩展名( .pyd ),配置类型改为 动态库(.dll)

bc91fcc2b490db337d2a24551d42821a.png

然后转到 配置属性->VC++目录

ef7c01c950b444b5603574c78cd5b98e.png
  • 包含目录中加上 Anaconda 安装目录中的 include 目录,以及之前编译时--prefix="g:boost" 指定的那个目录下的 includeboost-1_69 ,如下所示:
C:Usersuser nameAnaconda3include
G:boostincludeboost-1_69 
  • 库目录同理,加上 Anaconda 安装目录中的 libs 目录以及--prefix="g:boost"指定目录下的 lib,如下:
C:Usersuser nameAnaconda3libs
G:boostlib

注 : 这步完成后,切记别忘了点 确定

测试 Hello Boost Python

向项目中添加一个 main.cpp 文件,并加入以下代码:

// File : main.cpp
// 不在 #include <boost/python/...> 之前加上下面的宏定义的话
// 编译器会默认使用 Boost::Python 的动态链接库
#define BOOST_PYTHON_STATIC_LIB

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


const char * hello_boost() {
    return "Hello Boost::Python!";
}

const char * hello_world() {
    return "Hello World!";
}


// 此处 Hello_Boost 应该与之前设置的目标文件扩展名一致
// 否则想知道后果的话请自行尝试 ╮(╯▽╰)╭
BOOST_PYTHON_MODULE( Hello_Boost ) {
    using namespace boost::python;
    def( "hello_boost", hello_boost );
    def( "hello_world", hello_world );
}

接下来按 Ctrl + F7 编译,可能会遇到一个神奇的错误

error C3861: 'unwind_type': identifier not found

如果用的是最新版的 VS 2017 的话,肯定会碰上这个问题,这个问题似乎只会发生在 msvc 14.16 及以上的版本中。不要慌,问题不大,因为我在 Github 中找到了解决方法。( •̀ ω •́ )y

includeboostpythondetailunwind_type.hpp

找到上边这个文件,将里边所有的

#ifndef _MSC_VER

改为

#if (!defined(_MSC_VER) || _MSC_VER >= 1915)

具体可参考 Here

这样编译应该就没问题了,编译后会生成一个 Hello_Boost.pyd 文件,即 Python 的动态链接库文件。可能还会遇到下面这个错误,忽略即可( ̄︶ ̄)↗

048cf1ac2ea4de2824fdd4ccf94f5353.png

Hello_Boost.pyd 该文件路径下打开 Powershell,进入 Python 交互式命令窗口,import 那个 .pyd 文件 (不用加后缀),我们来测试一波~

8dbf6dcc07cda62e7c8d09601b990b61.png

如果你也看到如上结果,那恭喜你成功啦 o( ̄ ▽  ̄)o Boost::Python 踩坑第一阶段完成!完整代码可在 Here 找到,如果大家觉得我的文章有用的话,不妨给个 Star (o ゜ ▽ ゜)o☆


引用及参考

Code Style — The Hitchhiker's Guide to Python​docs.python-guide.org
4e9ad9d1d2ce14e5b8802c87e549a527.png
PEP 20 -- The Zen of Python​www.python.org
c9d3522d8708ed974d8310441767e276.png
boost.python/GettingStarted - Python Wiki​wiki.python.org C++与 Python 混合编程:Boost.python 的安装与使用​blog.csdn.net
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值