OS X Python:我能为扩展明确设置MACOSX_DEPLOYMENT_TARGET吗?

4
我使用最新版本的OS X(即10.11 El Capitan)下的Python框架python.org。我需要构建一些依赖于最新编译器(例如C++-11特性)的扩展。然而,python.org Python也是为了向后兼容而构建在旧系统上运行的。
因此,它具有环境变量MACOSX_DEPLOYMENT_TARGET=10.6。这意味着扩展默认情况下使用工具链构建,我认为它模仿了gcc-4.2,特别是在stdlib搜索方面。
过去,我通过使用homebrew安装更多的最新编译器并在安装前显式设置CCCXX等来修复这个问题。
然而,我尝试了只设置MACOSX_DEPLOYMENT_TARGET=10.11,似乎可以工作。这样做是否安全?有什么不利影响吗?(我不需要分发这些构建,只是在本地使用它们?)
1个回答

8

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还通过设置相应的“标准”环境变量(如CCCXXCFLAGSLDSHARED等)来优先考虑覆盖各种其他构建值。

您可能需要更改部署目标的一种情况是如果您正在处理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 '{}' ';'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接