使用多个Python版本构建Boost

Cad*_*hon 17 python boost compilation boost-python

我使用Python的几个版本我的电脑上:2.6.6,2.7.62.7.9.当我用boost-python编译Boost时,我必须让Python在参数中使用.如果我想要兼容性,我是否要为每个Python版本编译Boost?(这是非常巨大的!)或者有没有办法只使用一个Boost版本和几个python版本?

Tan*_*ury 34

官方Python 开发周期没有描述版本之间应用程序二进制接口(ABI)的稳定性.对于Python 3.2之前的版本,无法保证ABI兼容性.对于3.2及更高版本,PEP 384定义了稳定的ABI,其中保证Python/C API的子集保持ABI兼容性.要使用此子集,Py_LIMITED_API需要在构建Boost.Python和扩展模块时进行定义.

虽然它主要依赖于直接在用户代码中使用的Python/C API类型和功能,或者通过Boost.Python,通常:

  • 对于主要版本,例如Python 2和Python 3,Boost.Python和用户代码将需要重新编译
  • 对于次级版本,例如Python 2.6和Python 2.7,Boost.Python和用户代码可能需要重新编译
  • 对于微级版本,Boost.Python和用户代码很少需要重新编译

在需要重新编译Boost.Python的所有情况下,不需要重新编译其他Boost库.构建Boost.Python的多个版本时,请验证是否发生了干净的构建.如果没有干净的构建,Boost.Python可能会构建,但无法正确链接.例如,PyClass_Type不应在Python 3 Boost.Python构建中引用该符号,但如果没有干净的构建,以前的构建工件可能会填充库:

$ ./bootstrap.sh --with-python=/usr/bin/python2
...
Detecting Python version... 2.7
$ ./b2 --with-python --buildid=2 # produces libboost_python-2.so
$ ./bootstrap.sh --with-python=/usr/bin/python3 --with-python-root=/usr
...
Detecting Python version... 3.3
$ ./b2 --with-python --buildid=3noclean # produces libboost_python-3noclean.so
$ ./b2 --with-python --clean
$ ./b2 --with-python --buildid=3 # produces libboost_python-3.so

$ nm -D stage/lib/libboost_python-2.so | grep PyClass_Type
                 U PyClass_Type
$ nm -D stage/lib/libboost_python-3noclean.so | grep PyClass_Type
                 U PyClass_Type
$ nm -D stage/lib/libboost_python-3.so | grep PyClass_Type
Run Code Online (Sandbox Code Playgroud)

请注意,即使3noclean构建是针对Python 3构建的,使用Python 2的先前构建也会产生污染3noclean库的工件.另外,请注意Boost.Python和用户代码可能需要重新编译才能匹配Python的CPU架构和UCS-2或UCS-4 unicode配置.


gar*_*on4 11

从 Boost 1.67 开始,您可以构建 boost,以便它为您指定的每个 Python 版本生成一个单独的 libboost_python 版本,而无需在此过程中进行清理或重建。

例如,我编辑tools/build/src/user-config.jam以包含系统上的 Python 版本:

using python : 2.7 : /opt/python/cp27-cp27mu/bin/python : /opt/python/cp27-cp27mu/include/python2.7 : /opt/python/cp27-cp27mu/lib ;
using python : 3.5 : /opt/python/cp35-cp35m/bin/python : /opt/python/cp35-cp35m/include/python3.5m : /opt/python/cp35-cp35m/lib ;
using python : 3.6 : /opt/python/cp36-cp36m/bin/python : /opt/python/cp36-cp36m/include/python3.6m : /opt/python/cp36-cp36m/lib ;
using python : 3.7 : /opt/python/cp37-cp37m/bin/python : /opt/python/cp37-cp37m/include/python3.7m : /opt/python/cp37-cp37m/lib ;
Run Code Online (Sandbox Code Playgroud)

然后,我运行./b2 python=2.7,3.5,3.6,3.7构建步骤。

一些下游软件包希望升压Python库被称为libboost_python.so为Python 2.x和libboost_python3.soPython的3.x的,你可能需要明确指定-lboost_python27-lboost_python35等拿到这些程序链接正确。