Boost.python安装和踩坑记录

前言

Boost.python可以用来包装cpp的函数和类;python可以通过import的方式导入被包装后的动态链接库。

但是配置和安装的这几天真的是狠狠地重温了老式教程的恶意,最后还是官方文档加一堆千奇百怪的教程才搞定。

在开始前,值得强调一下:版本、Boost编译的参数、shared 编译的命名之类的都有可能会影响最后的结果!!! 和我一样是cmake小白的人最好不要随意改动版本和参数

环境

ubuntu、python3.9、cmake3.16

Boost.python安装

boost.python是boost中的一个library,安装的时候需要下载整个boost。

值得注意的是:目前最新的版本是1.82.0,但是在编译的时候一直报错,建议如果不是对版本有特殊需求,就下载1.80.0好了。

cd /your/tools/path
wget https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.gz

tar -xzvf boost_1_80_0.tar.gz
cd boost_1_80_0

boost.python在编译的时候需要链接到python的解释器,默认会使用在/usr里面的那个python。而老版的ubuntu的python可能是2.x版本的,建议指定为你正在使用的版本。我们可以激活conda的环境,然后通过which来查找。

conda activate your_envs
which python
# 记下python的路径,一般是/xx/xx/bin/python

然后编译编译器。
–prefix 是要安装到的路径,如果有root权限可以按照到默认路径,这样也方便cmake找,没有的话就挑一个喜欢的位置吧。
–with-python这里指定安装boost.python39这个库。(如果想安装所有库可以添加一句–with-libraries=all)
–with-python-root指定python解释器的位置,也就是前面which得到的路径

./bootstrap.sh --prefix=/prefer/path/of/boost --with-python=python3.9 --with-python-root=/your/python/path

这一步可以不进行)编译好了之后boost会说可以修改project-config.jam文件来进一步修改编译。我一开始修改了,为python添加了对应的include和lib的地址,但是编译后安装不了。这里我写一下,如果有一些比较复杂的需求的话可以配置试试(装不了请删掉解压和编译的boost,重新解压一个新的):

  1. vim打开project-config.jam
  2. 在普通模式下:?using python定位到需要修改的位置,并在倒数的两个冒号后分别添加include和lib的路径:
# Python configuration
import python ;
if ! [ python.configured ]
{
    using python : 3.9 
    : "/xxx/bin/python" 
    : "/xxx/include"
    : "/xxx/lib";
}

保存退出后:

./b2 install

如果没报错,就大功告成啦~

测试是否安装成功

cd ~
mkdir boost_temp

cd boost_temp
touch hello.cpp
touch hello.py
touch CMakeLists.txt
mkdir build

进入hello.cpp,添加:

#include <boost/python.hpp>

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

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

进入hello.py,添加:

import build.hello as hello

print(hello.greet())

进入CMakeLists.txt,一定要注意MODULE_NAME、生成动态链接库的名字和cpp中BOOST_PYTHON_MODULE的名字要一致。添加:

# cmake的最小版本需求,小于3.16应该也行
cmake_minimum_required(VERSION 3.16)
project(hello)

# MODULE_NAME很重要,当hello.cpp的文件名和MODULE_NAME和动态链接库的名字不相同就会报错
# 别问我咋知道的
set(MODULE_NAME hello)

# 这里,如果Boost和python是默认安装,可以尝试用find_package直接导入
# 作为cmake小白我就手动导入了
set(Boost_LIBRARIES "/your/boost/path/lib/libboost_python39.so")
set(PYTHON_LIBRARIES "/your/python/path/lib/libpython3.9.so")
set(Boost_INCLUDE "/your/boost/path/include")
set(PYTHON_INCLUDE "/your/python/path/include/python3.9")
 
add_library(${MODULE_NAME} SHARED hello.cpp)
 
 # 添加这句确保动态链接库前面不会多个lib
if (UNIX)
  set_target_properties(${MODULE_NAME}
    PROPERTIES
    PREFIX ""
  )
endif()

target_link_libraries(${MODULE_NAME}
  ${Boost_LIBRARIES}
  ${PYTHON_LIBRARIES}
)

include_directories(
  ${Boost_INCLUDE}
  ${PYTHON_INCLUDE}
)

link_directories(
  ${Boost_INCLUDE}
  ${PYTHON_INCLUDE}
)

全部添加好后尝试make和测试:

cd build
cmake ..
make
cd ..

python hello.py

如果能够输出:

hello, world!

就成功安装了。

Reference

3和4我参考的其他仙贝的boost安装教程,建议别完全跟着做,参数和配置文件之类的好像不太适合新的版本。

  1. boost getting started:https://www.boost.org/doc/libs/1_78_0/libs/python/doc/html/tutorial/index.html#tutorial.quickstart
  2. boost install: https://www.boost.org/doc/libs/1_82_0/more/getting_started/unix-variants.html#identify-your-toolset
  3. https://zhuanlan.zhihu.com/p/60215378
  4. https://blog.csdn.net/weixin_41923935/article/details/106967144
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值