我使用 python.org最新版本的 OS X(即 10.11 El Capitan)下的 Python 框架构建。我需要构建一些依赖于最新版本编译器的扩展(例如,C++-11 特性)。然而,为了向后兼容,python.org python 也是为在旧系统上工作而构建的。
因此,它具有环境变量 MACOSX_DEPLOYMENT_TARGET=10.6
。这意味着扩展是默认使用工具链构建的,我认为该工具链模仿 gcc-4.2
,特别是在它搜索的stdlib
方面。
在过去,我通过使用自制软件安装更新的编译器并在安装前显式设置 CC
、CXX
等来解决此问题。
但是,我尝试过只设置 MACOSX_DEPLOYMENT_TARGET=10.11
,这似乎可行。这样安全吗?有什么缺点吗? (我不需要分发这些构建,只在本地使用它们?)
最佳答案
为最近的 Python 版本构建的 python.org OS X 64 位/32 位框架是在 MACOSX_DEPLOYMENT_TARGET
设置为 10.6 的情况下构建的,并构建在 Mac OS X 10.6 上以确保与广泛的兼容性OS X 版本。目前该范围从 10.6 Snow Leopard 到 10.11 El Capitan。使用 Python 内置的 Distutils 或使用 Distutils 的高级工具(例如 pip
)构建 C 或 C++ 扩展模块时,编译和链接环境的部署目标默认设置为解释器构建,因此在本例中为 10.6
,以尝试生成扩展模块,这些扩展模块将与解释器构建本身一起使用相同范围的 OS X 版本。很少需要更改此设置,因为 Apple 通常非常擅长维护 Python 本身使用的系统库和框架的向后兼容性。但是,正如您发现的那样,您可以通过在构建扩展模块之前设置 MACOSX_DEPLOYMENT_TARGET
环境变量来将部署目标覆盖到较新的版本。 (Distutils 检查并不允许将部署目标设置为比用于解释器构建的版本旧的版本。)Distutils 还通过设置相应的“标准”环境变量来尊重覆盖各种其他构建值,如CC
, CXX
, CFLAGS
, LDSHARED
等
您可能需要更改部署目标的一种情况是您正在处理 C++ 代码。正如其他地方广泛讨论的那样,在最近的版本中,Apple 一直在从基于 GCC 的 libstdc++
迁移到 C++ 程序的 Clang/LLVM libc++
标准库。苹果一直在发货。 Python 解释器及其提供的标准库根本不使用 C++,因此这个问题不会影响 Python 本身。但是,如果您使用用 C++ 编写的扩展模块(或链接到用 C++ 编写的第三方库),无论是您自己的还是来自第三方包(例如从 PyPI 下载),您可能 需要注意所有 C++ 代码要么使用相同的 C++ 标准库构建,要么不同的 C++ 模块不共享对象。我没有处理过此类 C++ 情况的个人经验,因此我不确定避免可能出现的任何问题的最佳方法是什么。但是一个快速而肮脏的检查可能是在所有扩展模块和它们链接的共享库和框架上使用 Apple 的 otool
命令行实用程序,以查找对 libstdc++
和 libc++
,所以类似于从检查输出开始:
find -E . -regex '(.*\.so)|(.*\.dylib)' -exec otool -L '{}' ';'
关于python - OS X python : can I explicitly set MACOSX_DEPLOYMENT_TARGET for extensions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33184316/