2015-03-03 112 views
13

我在我的计算机上使用多个版本的Python:2.6.6,2.7.62.7.9。当我用boost-python编译Boost时,我必须让Python在参数中使用。如果我想兼容,有我为每个Python版本编译Boost?(这是相当巨大!)或者是有没有办法只使用一个版本的Boost与几个Python版本?使用多个Python版本构建Boost

+1

编译boost for python 2.7.9 **应该**适用于所有版本的python早在2.5。虽然,它不会为python 3工作。 – randomusername 2015-03-05 21:33:16

回答

25

官方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的多个版本时,验证清洁构建发生。如果没有干净的构建,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 

注意的是,即使3noclean生成已对Python的建3,以前使用Python 2的版本会产生污染3noclean库的工件。此外,请注意,Boost.Python和用户代码可能需要重新编译以匹配Python的CPU体系结构和UCS-2或UCS-4 unicode配置。

+0

感谢您的回答! – Caduchon 2015-03-06 11:57:33