【问题标题】:In Xcode project target build settings, What is Mach-O Type?在 Xcode 项目目标构建设置中,什么是 Mach-O 类型?
【发布时间】:2012-10-16 10:29:28
【问题描述】:

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

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

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

【问题讨论】:

标签: objective-c ios xcode linker llvm


【解决方案1】:

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

【讨论】:

  • 我就类似的话题征求您的意见,但不知道如何联系到您。我很乐意应您的要求发布问题。
  • 你确定“可重定位对象文件”是动态库的另一个词吗? AFAIK,它是目标文件(使用时静态链接 - 所以这是另一种形式的静态静态库)。静态库包含多个对象,而可重定位对象文件是单个对象。
  • 我认为它与 ELF 可重定位目标文件不同。有人可以仔细检查吗?
  • 我在项目中使用可可豆荚。如果我将我的可可豆框架设置为静态库而不是动态库。会引起什么问题吗??
【解决方案2】:

根据苹果文档,

查看更多详情Building Mach-O FilesXcode Build Setting Reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多