首页 > 解决方案 > 位码是否支持弱链接第三方框架?

问题描述

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

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

但是,当尝试从位码重建时会出现问题,这通常发生在选择“从位码重建”导出 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 确实包含位码。

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

标签: iosframeworksllvmbitcodeweak-linking

解决方案


在您的情况下,您将需要等待框架本身的修复。

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

无需在没有位码的情况下进行分发。长话短说,其中包含 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从二进制文件中关闭代码覆盖工具

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


推荐阅读