bitcode是否支持弱链接第三方框架?

Does bitcode support weak linking third party frameworks?

问题仅在标题中陈述。这是我的设置:

构建动态框架,可选择 links(弱 link)到 GoogleInteractiveMediaAds.framework。对于使用我的框架的应用程序,GoogleInteractiveMediaAds 是一个可选的依赖项,没有它框架也能正常工作。目前正在运行。

但是,当尝试从位码重建时会出现问题,这通常发生在导出选中 "Rebuild from Bitcode" 的 Ad Hoc 构建时。位码编译过程失败:

ipatool failed with an exception: #<CmdSpec::NonZeroExitException: $/Applications/Xcode.app/Contents/Developer/usr/bin/bitcode-build-tool ...

深入查看日志文件,我发现了错误描述:

Failed to resolve linkage dependency MyFramework arm64 -> @rpath/GoogleInteractiveMediaAds.framework/GoogleInteractiveMediaAds: Could not resolve @rpath in @rpath/GoogleInteractiveMediaAds.framework/GoogleInteractiveMediaAds from MyFramework
error: GoogleInteractiveMediaAds not found in dylib search path

注意:GoogleInteractiveMediaAds.framework 确实包含位码。

显然这个错误是通过不选择 "Rebuild from Bitcode" 来避免的。如果我要回答我自己的问题,我会说,不,从位码编译时,你不能使用弱 linked 框架。仅仅因为位码编译步骤试图 link 到一个不包含在应用程序目标中的框架。但是我还没有找到任何官方文档使用 weak linking with bitcode,或者关于它的任何相关的 Whosebug 答案,所以我不确定我是否遗漏了什么或者是否有一些相关的compiler/linker 我缺少使其正常工作的设置。

对于您的情况,您需要等待框架本身的修复。

我们在分发我们的框架时遇到了类似的问题,我对此进行了描述 我只是不想分享我们的调查结果,因为似乎没有人发布他们的结果。

没有bitcode就不用分发了。长话短说,其中包含 LLVM 检测,这会阻止 AppStore 处理。我写了整篇关于 XCode 12 and BigSur issues with XCFramework.

的博客

总而言之,在为分发创建 XCFramework 时,需要执行以下几个必要步骤以确保:

  • 使用存档构建是必须,发布构建是不够的
  • BUILD_LIBRARY_FOR_DISTRIBUTION 必须设置为 YES
  • SKIP_INSTALL 必须设置为 NO
  • GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO 关闭 GCC 工具并将它们从二进制文件中删除
  • CLANG_ENABLE_CODE_COVERAGE = NO 从二进制文件中关闭代码覆盖工具

以上所有内容有助于解决我们的准备和分发问题,如果您碰巧遇到与我们相同的问题,希望能为您节省一些时间。