使用多个Python版本构建Boost

时间:2015-03-03 11:26:35

标签: python boost compilation boost-python

我在计算机上使用了多个版本的Python:2.6.62.7.62.7.9。当我用boost-python编译Boost时,我必须让Python在参数中使用。如果我想要兼容性,那么我是否需要为每个Python版本编译Boost?(它非常庞大!)或者有没有办法只使用一个带有几个python版本的Boost版本?

2 个答案:

答案 0 :(得分:33)

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

虽然它主要依赖于直接在用户代码中使用的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的多个版本时,请验证是否发生 clean 构建。如果没有干净的构建,Boost.Python可能会构建,但无法正确链接。例如,不应在Python 3 Boost.Python构建中引用PyClass_Type符号,但如果没有干净的构建,以前的构建工件可能会填充库:

$ ./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

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

答案 1 :(得分:0)

从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 ;

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

某些下游软件包希望Boost python库在Python 2.x中被称为libboost_python.so,在Python 3.x中被称为libboost_python3.so,您可能需要显式指定-lboost_python27,{ {1}}等,以使这些程序正确链接。