我在最新版本的OS X(即10.11 El Capitan)下使用python.org框架构建的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++到libc++C++程序的Clang/LLVM 标准库的过程中.Apple一直在发货.Python解释器及其提供的标准库根本不使用C++,因此这个问题不会影响Python本身.但是,如果您使用用C++编写的扩展模块(或链接到用C++编写的第三方库),无论是您自己的还是第三方软件包(例如从PyPI下载),您可以使用需要注意的是,所有的C++代码都是使用相同的C++标准库构建的,如果不是,那么不同的C++模块不会共享对象.我没有这种C++情况的个人经验,所以我不确定什么是避免可能出现的任何问题的最佳方法.但一个快速和肮脏的检查可能是使用苹果的otool命令行实用程序上所有的扩展模块和共享库,并与他们联系框架,以找到要么所有引用libstdc++,并libc++像从检查开始输出,这样的东西:
find -E . -regex '(.*\.so)|(.*\.dylib)' -exec otool -L '{}' ';'
Run Code Online (Sandbox Code Playgroud)