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
从二进制文件中关闭代码覆盖工具
以上所有内容有助于解决我们的准备和分发问题,如果您碰巧遇到与我们相同的问题,希望能为您节省一些时间。
问题仅在标题中陈述。这是我的设置:
构建动态框架,可选择 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
从二进制文件中关闭代码覆盖工具
以上所有内容有助于解决我们的准备和分发问题,如果您碰巧遇到与我们相同的问题,希望能为您节省一些时间。