在Xcode项目目标版本设置中,什么是Mach-O Type?

在厌倦了众多的Match-O链接器错误之后,我想知道这个东西的意思。 我不想尝试和错误的解决scheme,我想知道这些事情背后的概念。 具体我想知道之间的区别:

  1. 可执行文件
  2. dynamic库
  3. 静态库
  4. 可重定位的对象文件

这些是我在“链接”部分单击“Mach-Otypes”设置时显示的选项。 一些小的定义或一些适当的内容的链接也没关系。

Mach-O是Mach目标文件格式的缩写,是可执行文件,目标代码,共享库,dynamic加载代码和核心转储的文件格式。 对于unix用户来说,这就像a.out但有所改进。 这是Mac OS X和iPhone OS库中用于执行文件的格式。

如你所知,iOS设备(iPhone,iPad等)有不同的体系结构ARMv6(iPhone 2G + 3G,iPod Touch)和ARMv7(iPhone 3GS,iPod Touch 2G + 3G),但Xcode中使用的模拟器主要运行在i386平台上。 这意味着库客户端必须为模拟器和设备设置单独的目标。 单独的目标重复大部分信息,仅在所包含的静态库中有所不同。 所以如果你得到了一个Mach-O链接器的错误,这意味着xcode无法链接到目标设备的一个库; 由于编译失败。

现在你的定义 –

  1. 可编译的机器目标程序准备以二进制格式运行。
  2. dynamic库 – 在运行时链接 – 一个引用dynamic库的程序将在启动(或按需)时加载并链接库。
  3. 捆绑包和包标识符让iOS和OSX可以识别您的应用程序的任何更新。 它给了它在应用程序中的独特存在。
  4. 静态库 – 文件在构build时被链接。 代码被复制到可执行文件中。 库中未被程序引用的代码被删除。 只有静态库的程序在运行时没有任何依赖关系。
  5. 可重定位的对象文件 – 是dynamic库的另一个词。 当您与dynamic库链接时,将根据库在内存中的加载位置计算其中包含的函数的地址。 它们是“可重定位的”,因为包含的function的地址不是在链接时确定的。 (在静态库中,地址是在链接期间计算的。)

根据苹果文件,

Mach-O类型定义

检查这个更多细节构buildMach-O文件和Xcode生成设置参考