我用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(使用前将#替换为@)