Ответ 1
Официальный цикл Python не описывает стабильность бинарного интерфейса приложения (ABI) между выпусками. Для релизов перед Python 3.2 нет гарантии совместимости с ABI. Для 3.2 и выше PEP 384 определяет стабильную ABI, где гарантируется подмножество API Python/C для обеспечения совместимости с ABI. Чтобы использовать это подмножество, Py_LIMITED_API
необходимо определить при создании Boost.Python и модулей расширения.
В то время как это зависит в первую очередь от типов 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 проверяется сборка clean. Без чистой сборки 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 и конфигурациями Unicode UCS-2 или UCS-4.