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

36

在遇到了无数的Match-O链接错误之后,我想知道这些东西的含义。与其试错解决,我更想了解这些东西背后的概念。具体而言,我想知道以下几点之间的区别:

  1. 可执行文件
  2. 动态库
  3. 捆绑包
  4. 静态库
  5. 可重定位目标文件

当我点击连接选项中的Mach-O类型设置时,这些选项会被呈现出来。一些小的定义或链接到适当内容的链接也可以。


3
https://developer.apple.com/library/mac/#documentation/developertools/conceptual/MachOTopics/1-Articles/building_files.html - iDev
2个回答

45

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
你确定“可重定位目标文件”是动态库的另一个说法吗?据我所知,它是一个对象文件(在使用时静态链接 - 因此这是另一种静态库的形式)。虽然静态库包含多个对象,但可重定位目标文件是单个对象。 - Krypton
我认为它与ELF可重定位目标文件不同。有人可以再确认一下吗? - Krypton
我在项目中使用 CocoaPods。如果我将我的 CocoaPods 框架设置为静态库而不是动态库,会有任何问题吗? - Nimisha Ranipa

8

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