我在计算机上使用了多个版本的Python:2.6.6
,2.7.6
和2.7.9
。当我用boost-python编译Boost时,我必须让Python在参数中使用。如果我想要兼容性,那么我是否需要为每个Python版本编译Boost?(它非常庞大!)或者有没有办法只使用一个带有几个python版本的Boost版本?
答案 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:
在需要重新编译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}}等,以使这些程序正确链接。