macOSX-version-min指的是什么?

30

当我传递编译器标志-mmacosx-version-min = 10.5时,这意味着什么?我认为这意味着结果二进制文件是x86,而不是ppc,但它是32位还是64位?我正在Snow Leopard上编译,因此默认输出二进制文件是64位。我没有传递-universal,我认为它不是32位-64位通用二进制文件。

4个回答

24

这个选项将被放置在头文件中的各种可用性宏所使用。这意味着即使您有一个更新的SDK(即使用10.6 SDK来定位10.5),您也可以要求最低OS版本。在以10.5为目标时使用10.6 API将触发警告,并且API将连接到weak_import属性。

大多数苹果的API头文件都包含了每个类、方法、函数或枚举的可用性宏,以便为每个声明:

  • 支持的最低操作系统
  • 已弃用的功能
  • 不可用性
  • ...

这些宏看起来像:

  • AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER
  • AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED
  • ...

至于架构,它仅取决于SDK的二进制文件中可用的架构。例如,使用10.5 SDK,您可以针对四种架构(Intel/32位,PowerPC/32位,Intel/64位,PowerPC 64位)进行定位,而使用10.6 SDK,则只能针对三种架构(Intel/32位,PowerPC/32位,Intel/64位)进行定位。

由于您正在使用Snow Leopard,因此可以通过传递架构选项来非常简单地定位i386(Intel/32位),ppc(PowerPC/32位)或x86_64(Intel/64位),如下所示:

gcc -arch i386
或者像这样(对于基于配置的项目):
CFLAGS="-arch i386" LDFLAGS="-arch i386" ./configure

我必须 #include <available.h> 才能在普通的 C 中使用这些宏。但是 available.h 也包含在 stdlib.h 中。 - Hans-Christoph Steiner
1
另请参见下面的@Kristian的答案。此外,我发现最低版本等于或高于10.8将生成略微不同的符号('_start'符号的链接已更改,可能与新的默认C++库一致)。 - Ephemera

12

-mmacosx-version-min=...也会影响C++ STL(GNU或LLVM)的默认选择,因此在这方面,对于编译器和链接器来说同样重要。


3
确实。在 Mavericks 系统上,C++ STL库的默认设置已经更改,这一点尤其重要。 - the Ritz

11

经过我的测试,我发现将这个选项传递给链接步骤(例如 -arch)也很重要;因此它不仅会影响宏/预处理(可能会被其他答案推断出来),而且还会有更多的影响。

当传递给编译步骤但未传递给链接步骤时,我发现在 10.5 下无法加载使用 10.6 构建的共享库。


5

它会触发编译器警告,针对出现在Mac OS X 10.5之后的方法。这与架构无关。


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