2015-03-03 114 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