2015-03-03 17 views
13

Tôi sử dụng một số phiên bản Python trên máy tính của mình: 2.6.6, 2.7.62.7.9. Khi tôi biên dịch Boost với boost-python, tôi phải cho Python sử dụng trong đối số. Nếu tôi muốn khả năng tương thích, tôi có phải biên dịch Boost cho mỗi phiên bản Python không? (nó khá lớn!) Hoặc là có một cách để sử dụng chỉ có một xây dựng của Boost với một số phiên bản python?Xây dựng Boost với nhiều phiên bản Python

+1

Tăng biên dịch cho python 2.7.9 ** nên ** hoạt động đối với tất cả các phiên bản của python từ 2,5 trở lên. Mặc dù, nó sẽ không hoạt động cho python 3. – randomusername

Trả lời

25

Python development cycle chính thức không mô tả tính ổn định của giao diện nhị phân ứng dụng (ABI) giữa các bản phát hành. Đối với các bản phát hành trước Python 3.2, không có sự đảm bảo nào về khả năng tương thích của ABI. Đối với 3.2 và hơn thế nữa, PEP 384 xác định stable ABI trong đó một tập hợp con của API Python/C được đảm bảo duy trì khả năng tương thích ABI. Để sử dụng tập con này, cần phải xác định Py_LIMITED_API khi tạo mô-đun Boost.Python và tiện ích mở rộng.

Trong khi nó chủ yếu phụ thuộc vào các loại API Python/C và chức năng được sử dụng trực tiếp trong mã sử dụng hoặc thông qua Boost.Python, nói chung:

  • cho phát hành chính cấp, chẳng hạn như Python 2 và Python 3, Boost.Python và mã người dùng sẽ cần phải được biên dịch lại
  • cho các bản phát hành cấp độ nhỏ, chẳng hạn như Python 2.6 và Python 2.7, Boost.Python và mã người dùng có thể cần phải được biên dịch lại
  • cho các bản phát hành cấp vi mô, Mã Boost.Python và mã người dùng hiếm khi cần biên dịch lại

Trong mọi trường hợp Boost.Python cần được biên dịch lại, không cần phải biên dịch lại thư viện Boost khác. Khi xây dựng nhiều phiên bản của Boost.Python, hãy xác minh việc xây dựng sạch xảy ra. Nếu không có một xây dựng sạch, Boost.Python có thể xây dựng, nhưng không liên kết đúng cách. Ví dụ, biểu tượng PyClass_Type không nên nhắc đến trong Python 3 Boost.Python xây dựng, nhưng không có một xây dựng sạch, trước xây dựng hiện vật có thể cư trú trong thư viện:

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

Lưu ý rằng mặc dù 3noclean xây dựng được xây dựng với Python 3, xây dựng trước đó đã được sử dụng Python 2 đã có hiện vật mà ô nhiễm thư viện 3noclean. Ngoài ra, hãy lưu ý rằng Boost.Python và mã người dùng có thể cần được biên dịch lại để phù hợp với kiến ​​trúc CPU của Python và cấu hình unicode UCS-2 hoặc UCS-4.

+0

Cảm ơn câu trả lời này! – Caduchon

Các vấn đề liên quan