Construye Boost con mĂșltiples versiones de Python
compilation boost-python (1)
Utilizo varias versiones de Python en mi computadora: 2.6.6
, 2.7.6
y 2.7.9
. Cuando compilo Boost con boost-python, tengo que darle el Python para usar en el argumento. Si quiero compatibilidad, ¿tengo que compilar Boost para cada versión de Python? (¡Es bastante enorme!) ¿O hay una forma de usar solo una versión de Boost con varias versiones de python?
El ciclo de desarrollo oficial de Python no describe la estabilidad de la interfaz binaria de la aplicación (ABI) entre las versiones. Para versiones anteriores a Python 3.2, no hay garantía de compatibilidad ABI. Para 3.2 y posteriores, PEP 384 define el ABI estable en el que se garantiza que un subconjunto de la API de Python / C mantiene la compatibilidad con ABI. Para usar este subconjunto, Py_LIMITED_API
debe definirse al crear Boost.Python y módulos de extensión.
Aunque depende principalmente de la funcionalidad y los tipos de API de Python / C que se usan directamente en el código de usuario o mediante Boost.Python, en general:
- para las versiones de mayor nivel, como Python 2 y Python 3, Boost.Python y el código de usuario deberán compilarse
- para versiones de nivel secundario, como Python 2.6 y Python 2.7, Boost.Python y el código de usuario pueden necesitar compilación
- para las versiones de micro-nivel, Boost.Python y el código de usuario rara vez necesitan volver a compilarse
En todos los casos donde Boost.Python necesita ser recompilado, ninguna otra biblioteca de Boost debería ser recompilada. Al crear varias versiones de Boost.Python, verifique que se produzca una construcción limpia . Sin una compilación limpia, Boost.Python puede compilar, pero no se puede vincular correctamente. Por ejemplo, el símbolo PyClass_Type
no debe ser referenciado en las compilaciones de Python 3 Boost.Python, pero sin una compilación limpia, los artefactos de compilación anteriores pueden llenar la biblioteca:
$ ./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
Tenga en cuenta que aunque la compilación 3noclean
se construyó contra Python 3, la compilación anterior que usaba Python 2 tenía artefactos que contaminaban la biblioteca 3noclean
. Además, tenga en cuenta que Boost.Python y el código de usuario pueden ser compilados para que coincidan con la arquitectura de la CPU del Python y las configuraciones de unicode UCS-2 o UCS-4.