Build Boost z wieloma wersjami Pythona
Używam kilku wersji Pythona na moim komputerze : 2.6.6
, 2.7.6
i 2.7.9
. Kiedy kompiluję Boost z boost-python, muszę dać Pythona do użycia w argumencie. Jeśli chcę kompatybilności, Czy muszę kompilować Boost dla każdej wersji Pythona ? (jest dość ogromny !) A może jest sposób na użycie tylko jednej kompilacji Boost z kilkoma wersjami Pythona ?
1 answers
Oficjalny cykl programowania Pythona nie opisuje stabilności binarnego interfejsu aplikacji (ABI) pomiędzy wydaniami. W przypadku wydań poprzedzających wydanie Pythona 3.2 nie ma gwarancji zgodności z ABI. Dla wersji 3.2 i nowszych, PEP 384 definiuje stabilny ABI, gdzie podzbiór API Pythona/C gwarantuje zachowanie kompatybilności ABI. Aby użyć tego podzbioru, należy zdefiniować Py_LIMITED_API
podczas budowania Boost.Python i moduły rozszerzeń.
Podczas gdy przede wszystkim zależy od typów API Python / C i funkcjonalności używanych bezpośrednio w kodzie użytkownika lub poprzez Boost.Python, ogólnie:
- dla wydań głównych, takich jak Python 2 i Python 3, Boost.Python i Kod użytkownika muszą być rekompilowane
- dla wydań podrzędnych, takich jak Python 2.6 i Python 2.7, Boost.Python i Kod użytkownika mogą wymagać rekompilacji
- dla wydań na poziomie mikro, Boost.Python i Kod użytkownika rzadko potrzebują recompiled
We wszystkich przypadkach, gdzie Boost.Python wymaga rekompilacji, żadna inna biblioteka Boost nie powinna być rekompilowana. Podczas budowania wielu wersji Boost.Pythona, zweryfikuj czystą kompilację. Bez czystej budowy, Boost.Python może budować, ale nie łączy się poprawnie. Na przykład, symbol PyClass_Type
nie powinien być odwoływany w Pythonie 3 Boost.Python buduje, ale bez czystej kompilacji, poprzednie artefakty mogą wypełniać bibliotekę:
$ ./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
Uwaga pomimo tego, że 3noclean
build został zbudowany przeciwko Pythonowi 3, poprzednia build, która używała Pythona 2, miała artefakty, które zanieczyszczały bibliotekę 3noclean
. Należy również pamiętać, że impuls.Python i Kod użytkownika mogą wymagać przekompilowania, aby dopasować architekturę CPU Pythona i konfiguracje unicode UCS-2 lub UCS-4.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-06 06:28:39