前言
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,重新解压一个新的):
- vim打开project-config.jam
- 在普通模式下
:?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安装教程,建议别完全跟着做,参数和配置文件之类的好像不太适合新的版本。
- boost getting started:https://www.boost.org/doc/libs/1_78_0/libs/python/doc/html/tutorial/index.html#tutorial.quickstart
- boost install: https://www.boost.org/doc/libs/1_82_0/more/getting_started/unix-variants.html#identify-your-toolset
- https://zhuanlan.zhihu.com/p/60215378
- https://blog.csdn.net/weixin_41923935/article/details/106967144