我在最新版本的OS X(即10.11 El Capitan)下使用了XP的python.org框架版本.我需要构建一些依赖于最新版本的编译器的扩展(例如,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标准库. Apple一直在发货. Python解释器及其提供的标准库根本不使用C,因此这个问题不会影响Python本身.但是,如果您使用用C语言编写的扩展模块(或链接到用C编写的第三方库),无论是您自己的还是第三方软件包(例如从PyPI下载),您可能需要小心所有C代码都是使用相同的C标准库构建的,如果不是,则不同的C模块不共享对象.我没有这种C情况的个人经验,所以我不确定什么是避免可能出现的任何问题的最佳方法.但是,快速而肮脏的检查可能是在所有扩展模块上使用Apple的otool命令行实用程序,以及它们链接的共享库和框架,以查找对libstdc和libc的所有引用,所以类似于从检查输出开始:
<code>find -E . -regex '(.*.so)|(.*.dylib)' -exec otool -L '{}' ';'
</code>
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!