【问题标题】:Build Boost with multiple Python versions使用多个 Python 版本构建 Boost
【发布时间】:2015-05-04 00:52:18
【问题描述】:

我在我的电脑上使用了多个版本的 Python:2.6.62.7.62.7.9。当我用 boost-python 编译 Boost 时,我必须给 Python 以在参数中使用。如果我想要兼容性,我必须为每个 Python 版本编译 Boost 吗?(它非常庞大!)或者有没有办法只使用一个版本的 Boost 和多个 Python 版本?

【问题讨论】:

  • python 2.7.9 的编译提升应该适用于所有版本的 python,最早可以追溯到 2.5。虽然,它不适用于 python 3。

标签: python boost compilation boost-python


【解决方案1】:

官方的 Python development cycle 没有描述应用程序二进制接口 (ABI) 版本之间的稳定性。对于 Python 3.2 之前的版本,不保证 ABI 兼容性。对于 3.2 及更高版本,PEP 384 定义了stable ABI,其中保证 Python/C API 的子集保持 ABI 兼容性。要使用这个子集,Py_LIMITED_API 需要在构建 Boost.Python 和扩展模块时定义。

虽然它主要取决于直接在用户代码中或通过 Boost.Python 使用的 Python/C API 类型和功能,但一般来说:

  • 对于主要级别的版本,例如 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 的 CPU 架构和 UCS-2 或 UCS-4 unicode 配置。

【讨论】:

  • 感谢您的回答!
【解决方案2】:

从 Boost 1.67 开始,您可以构建 boost,以便它为您指定的每个 Python 版本生成一个单独的 libboost_python 版本,而无需在该过程中进行清理或重建。

例如,我编辑 tools/build/src/user-config.jam 以包含系统上的 Python 版本:

using python : 2.7 : /opt/python/cp27-cp27mu/bin/python : /opt/python/cp27-cp27mu/include/python2.7 : /opt/python/cp27-cp27mu/lib ;
using python : 3.5 : /opt/python/cp35-cp35m/bin/python : /opt/python/cp35-cp35m/include/python3.5m : /opt/python/cp35-cp35m/lib ;
using python : 3.6 : /opt/python/cp36-cp36m/bin/python : /opt/python/cp36-cp36m/include/python3.6m : /opt/python/cp36-cp36m/lib ;
using python : 3.7 : /opt/python/cp37-cp37m/bin/python : /opt/python/cp37-cp37m/include/python3.7m : /opt/python/cp37-cp37m/lib ;

然后,我为构建步骤运行 ./b2 python=2.7,3.5,3.6,3.7

一些下游包期望 boost python 库在 Python 2.x 中称为 libboost_python.so,在 Python 3.x 中称为 libboost_python3.so,您可能需要显式指定 -lboost_python27-lboost_python35 等以让这些程序正确链接。

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 2021-01-15
    • 2021-03-07
    • 2011-07-17
    • 2013-08-24
    • 1970-01-01
    • 2015-10-12
    • 2012-07-31
    • 1970-01-01
    相关资源
    最近更新 更多