在Xcode项目目标构建设置中,什么是Mach-O类型?

时间:2012-10-26 06:50:59

标签: objective-c ios xcode linker llvm

在厌倦了众多Match-O链接器错误后,我想知道这件事意味着什么。我想知道这些事情背后的概念,而不是试错法。具体来说,我想知道它们之间的区别:

  1. 可执行
  2. 动态图书馆
  3. 捆绑
  4. 静态库
  5. 可重定位目标文件
  6. 当我点击链接部分上的Mach-O类型设置时,会显示这些选项。一些小的定义或一些指向适当内容的链接也可以。

2 个答案:

答案 0 :(得分:27)

Mach-O是Mach对象文件格式的缩写,是可执行文件,目标代码,共享库,动态加载代码和核心转储的文件格式。对于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. 动态库 - 在运行时链接 - 带有动态库引用的程序将在启动时(或按需)加载并链接库。
  3. 捆绑包 - 以及捆绑包标识符让iOS和OSX识别您应用的任何更新。它在应用程序中赋予它独特的存在感。
  4. 静态库 - 文件在构建时链接。代码被复制到可执行文件中。将删除程序中未引用的库中的代码。只有静态库的程序在运行时没有任何依赖项。
  5. 可重定位目标文件 - 是动态库的另一个词。当您与动态库链接时,将根据库在内存中的加载位置计算其中包含的函数的地址。它们是“可重定位的”,因为包含的函数的地址不是在链接时确定的。 (在静态库中,地址是在链接时计算的。)

答案 1 :(得分:6)

根据苹果文档,

Mach-O Type Definition

点击此处了解详情Building Mach-O FilesXcode Build Setting Reference