我在OS的最新版本(即10.11ElCapitan)下使用了python.org框架构建。我需要构建一些依赖于编译器最新版本的扩展(例如,C++-11特性)。但是,为了向后兼容,构建python.org python也是为了在旧系统上工作。
因此,它具有环境变量MACOSX_DEPLOYMENT_TARGET=10.6。这意味着在默认情况下,扩展是使用工具链构建的,我认为它模拟了gcc-4.2,特别是在stdlib搜索方面。
在过去,我已经修复了这个问题,在安装之前,我用自制的方式安装了更新的编译器,并显式地设置了CC、CXX等。
但是,我尝试过只设置MACOSX_DEPLOYMENT_TARGET=10.11,这似乎是可行的。这安全吗?有什么坏处吗?(我不需要分发这些构建,只需在本地使用?)
发布于 2015-10-23 18:12:18
最近发布的python.org OS 64位/32位框架构建时,MACOSX_DEPLOYMENT_TARGET设置为10.6,构建在MacOSX10.6上,以确保与广泛的OS版本兼容。目前,这一范围从10.6雪豹到10.11埃尔卡皮坦。当使用Python的内置远程或高级工具(如pip)构建C或pip扩展模块时,默认情况下,编译和链接环境的部署目标设置为解释器构建的目标,因此在本例中,10.6尝试生成与解释器构建自身相同范围的OS发行版的扩展模块。很少需要改变这一点,因为Apple对于维护Python本身使用的系统库和框架的向后兼容性来说通常是非常好的。但是,正如您所发现的,您可以通过在构建扩展模块之前设置MACOSX_DEPLOYMENT_TARGET环境变量,将部署目标覆盖到较新的版本。(远程检查并不允许将部署目标设置为比用于解释器构建的版本更早的版本。)通过设置相应的“标准”环境变量(如CC、CXX、CFLAGS、LDSHARED等),远程操作还可以重写其他各种构建值。
您可能需要更改部署目标的一种情况是,如果您处理的是C++代码。正如其他地方广泛讨论的那样,最近发布的苹果公司正在从基于GCC的libstdc++迁移到用于C++程序的Clang/LLVM libc++标准库。苹果公司一直在销售这两款产品。Python解释器及其提供的标准库根本不使用C++,因此这个问题不会影响Python本身。但是,如果使用用C++编写的扩展模块(或者链接到用C++编写的第三方库),无论是您自己的还是从第三方包(例如从PyPI下载的),您可能需要注意的是,所有的C++代码要么是使用相同的C++标准库构建的,要么是不同的C++模块不共享对象。我对这样的C++情况没有亲身经验,所以我不知道怎样才能最好地避免可能出现的任何问题。但是,快速检查可能是在所有扩展模块以及它们链接的共享库和框架上使用苹果的otool命令行实用工具来查找对libstdc++和libc++的所有引用,就像从检查来自:
find -E . -regex '(.*\.so)|(.*\.dylib)' -exec otool -L '{}' ';'https://stackoverflow.com/questions/33184316
复制相似问题