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

Mat*_*t.M 5 frameworks llvm weak-linking ios bitcode

问题在标题中简单说明。这是我的设置:

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

然而,当尝试从位码重建时会出现问题,这通常发生在选择“从位码重建”导出 Ad Hoc 构建时。位码编译过程失败:

ipatool failed with an exception: #<CmdSpec::NonZeroExitException: $/Applications/Xcode.app/Contents/Developer/usr/bin/bitcode-build-tool ...
Run Code Online (Sandbox Code Playgroud)

并深入查看日志文件,我找到了错误描述:

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
Run Code Online (Sandbox Code Playgroud)

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

显然,这个错误是通过不选择“从位码重建”来避免的。如果我要回答我自己的问题,我会说,不,看起来从 bitcode 编译时,您不能使用弱链接框架。仅仅是因为 bitcode 编译步骤试图链接到未包含在应用程序目标中的框架。但是,我无法找到任何关于使用位码弱链接的官方文档,或者任何相关的 StackOverflow 答案,所以我不确定我是否遗漏了什么,或者是否有一些相关的编译器/链接器设置我很想让它发挥作用。

nru*_*nyk 3

就您而言,您将需要等待框架本身的修复。

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

没有位码就不需要分发。长话短说,其中包含 LLVM 工具,这会阻止 AppStore 处理。我写了一篇关于XCode 12 和 BigSur 与 XCFramework 问题的完整博客。

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

  • 使用归档版本是必须的,发布版本是不够的
  • BUILD_LIBRARY_FOR_DISTRIBUTION必须设置为YES
  • SKIP_INSTALL 必须设置为NO
  • GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO关闭 GCC 检测并将其从二进制文件中删除
  • CLANG_ENABLE_CODE_COVERAGE = NO关闭二进制文件中的代码覆盖工具

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