OS X Python:我可以为扩展显式设置 MACOSX_DEPLOYMENT_TARGET 吗?

2024-01-21

我用python.org http://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),默认情况下,编译和链接环境的部署目标设置为解释器构建的部署目标,因此在本例中10.6,尝试生成与解释器构建本身相同的 OS X 版本范围的扩展模块。很少需要改变这一点,因为 Apple 通常非常擅长维护 Python 本身使用的系统库和框架的向后兼容性。但是,正如您所发现的,您可以通过设置MACOSX_DEPLOYMENT_TARGET构建扩展模块之前的环境变量。 (Distutils 检查并不允许将部署目标设置为发布older比用于解释器构建的值。)Distutils 还通过设置相应的“标准”环境变量来覆盖各种其他构建值,例如CC, CXX, CFLAGS, LDSHARED, etc.

一个案例,你might如果您正在处理 C++ 代码,则需要更改部署目标。正如其他地方广泛讨论的那样,在最近的版本中,Apple 一直处于从基于 GCC 的迁移过程中libstdc++到 Clang/LLVMlibc++C++ 程序的标准库。苹果公司已经发售了这两款产品。 Python 解释器及其提供的标准库根本不使用 C++,因此此问题不会影响 Python 本身。但是,如果您使用用 C++ 编写的扩展模块(或链接到用 C++ 编写的第三方库),无论是您自己的还是来自第三方包(例如,从 PyPI 下载),您may需要注意的是,所有 C++ 代码要么使用相同的 C++ 标准库构建,要么使用相同的 C++ 标准库构建,否则不同的 C++ 模块不共享对象。我没有处理此类 C++ 情况的个人经验,因此我不确定避免可能出现的任何问题的最佳方法是什么。但快速而粗略的检查可能是使用苹果的otool所有扩展模块以及它们链接的共享库和框架上的命令行实用程序,以查找对任一扩展模块的所有引用libstdc++ and libc++,所以从检查输出开始:

find -E . -regex '(.*\.so)|(.*\.dylib)' -exec  otool -L '{}' ';'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OS X Python:我可以为扩展显式设置 MACOSX_DEPLOYMENT_TARGET 吗? 的相关文章

随机推荐