因此,它具有环境变量
MACOSX_DEPLOYMENT_TARGET=10.6
。这意味着扩展默认情况下使用工具链构建,我认为它模仿了gcc-4.2
,特别是在stdlib
搜索方面。过去,我通过使用homebrew安装更多的最新编译器并在安装前显式设置
CC
、CXX
等来修复这个问题。然而,我尝试了只设置
MACOSX_DEPLOYMENT_TARGET=10.11
,似乎可以工作。这样做是否安全?有什么不利影响吗?(我不需要分发这些构建,只是在本地使用它们?)MACOSX_DEPLOYMENT_TARGET=10.6
。这意味着扩展默认情况下使用工具链构建,我认为它模仿了gcc-4.2
,特别是在stdlib
搜索方面。CC
、CXX
等来修复这个问题。MACOSX_DEPLOYMENT_TARGET=10.11
,似乎可以工作。这样做是否安全?有什么不利影响吗?(我不需要分发这些构建,只是在本地使用它们?)python.org的OS X 64位/32位框架版本是针对最近的Python版本构建的,使用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版本兼容的扩展模块。很少需要更改此设置,因为苹果公司通常非常擅长维护Python本身使用的系统库和框架的向后兼容性。但是,正如您发现的那样,您可以通过在构建扩展模块之前设置MACOSX_DEPLOYMENT_TARGET
环境变量来覆盖部署目标为较新的版本。(Distutils检查并不允许将部署目标设置为比解释器构建所用版本更旧的版本。)Distutils还通过设置相应的“标准”环境变量(如CC
,CXX
,CFLAGS
,LDSHARED
等)来优先考虑覆盖各种其他构建值。
您可能需要更改部署目标的一种情况是如果您正在处理C ++代码。正如在其他地方广泛讨论的那样,在最近的版本中,Apple一直在从基于GCC的libstdc ++
迁移到Clang / LLVM libc ++
标准库以用于C ++程序。苹果一直在运送两者。Python解释器及其提供的标准库根本不使用C ++,因此这个问题不会影响Python本身。但是,如果您使用用C ++编写的扩展模块(或链接到用C ++编写的第三方库),无论是您自己的还是来自第三方包(例如从PyPI下载),您都需要小心,确保所有C ++代码都使用相同的C ++标准库,或者如果没有,则不同的C ++模块不共享对象。我没有亲身经历过这样的C ++情况,所以我不确定避免可能出现的任何问题的最佳方法是什么。但是,一个快速而粗略的检查可能是对所有扩展模块和它们链接的共享库和框架使用Apple的otool
命令行实用程序,以查找所有对libstdc ++
和libc ++
的引用,因此从检查输出开始:
find -E . -regex '(.*\.so)|(.*\.dylib)' -exec otool -L '{}' ';'