gpt4 book ai didi

python - 使用多个 Python 版本构建 Boost

转载 作者:IT老高 更新时间:2023-10-28 21:08:29 26 4
gpt4 key购买 nike

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

最佳答案

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

虽然它主要取决于直接在用户代码中或通过 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 可能会构建,但无法正确链接。例如,在 Python 3 Boost.Python 构建中不应引用 PyClass_Type 符号,但如果没有干净的构建,以前的构建工件可能会填充库:

$ ./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 配置。

关于python - 使用多个 Python 版本构建 Boost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28830653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com