我应该在我的 iOS Objective-C 项目中使用什么 Mach-O 类型?

What is Mach-O type should I use it in my iOS Objective-C project?

Xcode 中构建设置中的 Mach-O 类型是什么?应该设置什么?

它有这些选项 "Executable" "Dynamic Library" "Bundle" "Static Library" "Relocatable Object File"

我有一个错误 "Apple Mach-O Linker Error Group" 自从我将它从可执行文件更改为静态库后我的错误就消失了,我想知道我是否可以更改它?以及所有这些选项的含义,这样我以后就不会再遇到其他错误了。

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

Mach-O 型

Official page which has some reflection in loader.h。另外 MH_PRELOAD 0x5, MH_CORE 0x4, MH_DYLINKER 0x7

设置 Mach-O Type 确定 链接器 行为

Framework target -> Build Settings -> Mach-O Type
  • Executable 0x2 (mh_execute/mh_executable) - 未链接。用于创建可启动程序 - ApplicationApp extension - WidgetApplication target 是默认设置
  • Bundle 0x8 (mh_bundle .bundle) - loadable bundle - 运行 时间链接。 iOS 现在仅支持 Testing Bundle target,默认设置是生成 Loadable bundle
    System -> Testing Bundle -> tested binary. Testing Bundle 的位置将取决于目标、静态或动态二进制...
  • Dynamic Library 0x6(mh_dylib .dylib 或 none)- Load/run 时间链接。
    • 使用 Framework target - Dynamic Library 是生成 Dynamic framework
    • 的默认设置
  • Static Library(staticlib .a) - 编译时间(build time)链接。
    • 使用 Static Library target - Static Library 是生成 Static library
    • 的默认设置
    • Framework target-Static Library生成一个Static framework
  • Relocatable Object File 0x1 (mh_object .o) - 编译时间(build time)链接。这是最简单的形式。它是创建可执行、静态或动态格式的基础。可重定位,因为变量和函数没有任何特定地址

使用otool判断二进制是否是动态的

很有用
otool -h <path_binary>
//e.g.
otool -h "/Users/alex/Desktop/projects_experiments/ios/LibraryAndFramework/BuildCustom/UtilsSwift/UtilsSwiftFramework.framework/UtilsSwiftFramework"

Mach header
      magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedfacf 16777228          0  0x00           6    30       3488 0x00100085

filetype是关键点-6-0x6-动态库

[Vocabulary]