我一直在更新一个静态库以支持位代码,从我的研究中,我发现了两种实现方法:

  • fembed-bitcode标志添加到"我的项目生成设置"中的"其他C标志"选项(link)
  • 添加用户定义的设置,按键BITCODE_GENERATION_MODE设置为bitcode(link)

Is there any difference between these two options?

我注意到的唯一区别是,通过使用fembed-bitcode,iphonesimulator生成的静态库将在启用完整位码的情况下构建(在我的情况下,二进制大小从5MB更改为13MB,我可以使用otool判断位码支持),这似乎对其使用没有任何影响.

推荐答案

正常构建库时,使用ENABLE_BITCODE=YES,Xcode会将构建标志-fembed-bitcode-marker添加到任何叮当声调用中,在最终的o文件中放置一个"空"位代码.

因此,如果您在构建阶段查看编译操作,它将如下所示:

编译{build_path}/StaticBitcode/StaticLogger.o静态位码/静态记录器.m普通armv7 objective-c com.苹果编译器.llvm.叮当声.1_0.编译程序

构建操作也是如此(独立于目标).

当您输入Build & Archive时,-fembed标志将被-fembed-bitcode取代,这确实构建了一个启用位码的二进制:

编译{build_path}/StaticBitcode/StaticLogger.o静态位码/静态记录器.m普通armv7 objective-c com.苹果编译器.llvm.叮当声.1_0.编译程序


fembed-bitcode flag

考虑到这一点,如果将-fembed-bitcode标志添加到其他C标志中,则将在编译期间向编译器发送两个标志.它可能会使您在使用链接到另一个项目的库时收到的一些警告静音.但是,你需要判断你是否达到了预期的行为.:)

(当我在其他C标志上使用-fembed-bitcode进行测试时,Xcode给出了警告clang: warning: argument unused during compilation: '-fembed-bitcode-marker')


BITCODE_GENERATION_MODE

另一方面

如果在User-defined Setting上设置BITCODE_GENERATION_MODE=bitcode,即使在构建阶段,文件也将使用标志-fembed-bitcode进行编译.

如果设置为BITCODE_GENERATION_MODE=marker,则文件将使用标志-fembed-bitcode-marker编译,与操作阶段无关.

因此,如果您想 for each 操作(构建和归档)启用位码,更好的方法是使用BITCODE_GENERATION_MODE设置.


Resources

Objective-c相关问答推荐

NSMutableDictionary 的深层可变副本

我应该为 memcpy 和 realloc 包含什么标题?

Objective-c 点表示法或方括号表示法中首选什么?

UIAlertController:supportedInterfaceOrientations 被递归调用

UIApplication.sharedApplication.delegate.window 和 UIApplication.sharedApplication.keyWindow 有什么区别?

如何声明仅调试语句

如何在 Cocoa 中创建字符串的 MD5 哈希?

XCTAssert 和 XCTAssertTrue 有什么区别?

检测代码是否在 Objective-C 的主线程上运行的正确方法是什么? (iOS)

Apple 的 API 中的k前缀表示什么?

如何在iphone的objective-c中以编程方式调整图像大小

Objective-C:前向类声明

从 NSRange 创建 UITextRange

iOS Buttons - 添加边框

Objective C 中的对象分配和初始化

可变集合有文字语法吗?

架构 i386 clang 的重复符号

如何删除 UIToolBar 上的顶部边框

UITableView,我如何知道 cellForRowAtIndexPath 期间的哪个部分?

xcode 5.1 中的 Arm64 架构