33

在厌倦了无数的 Match-O 链接器错误之后,我想知道这件事是什么意思。我想知道这些事情背后的概念,而不是反复试验的解决方案。具体来说,我想知道两者之间的区别:

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

这些是我在链接部分单击 Mach-O 类型设置时出现的选项。一些小的定义或一些指向适当内容的链接也可以。

4

2 回答 2

42

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. 可重定位目标文件 - 是动态库的另一个词。当您与动态库链接时,会根据库在内存中的加载位置计算其中包含的函数的地址。它们是“可重定位的”,因为包含函数的地址不是在链接时确定的。(在静态库中,地址是在链接时计算的。)
于 2012-10-26T07:13:51.970 回答
7

根据苹果文档,

Mach-O 类型定义

检查此以获取更多详细信息构建 Mach-O 文件Xcode 构建设置参考

于 2012-10-26T07:14:43.213 回答