为Swift二进制框架启用模块稳定性时dyld崩溃



我正在努力为我的二进制Swift框架启用模块稳定性。

我的设置如下:

  • Xcode 11.1
  • 已启用"为分发构建库"选项

我已经验证了输出的.framework确实在框架中包含了必要的.swiftinterface文件,所以理论上我认为它应该有效。

然而,当我尝试从任何应用程序使用此框架时,dyld在与__abort_with_payload一起启动时崩溃。

我在以下情况下尝试过:

  • 由Xcode编译的原始框架(.framework格式(
  • lipod胖框架(.framework格式(
  • 新XCFramework(.XCFramework(格式

在我测试过的所有情况下,启用此选项似乎会导致应用程序在启动时崩溃。

唯一想到的是,我的框架是一个我的框架本身依赖于其他第三方(非二进制(框架,这些框架是通过Cocoapods编译的。

在WWDC’19关于二进制框架的演讲中,我们被告知"您的所有依赖项都必须使用Build Libraries for Distribution构建设置来构建,以便获得我们所谈到的二进制兼容性保证"——然而,这并不能明确是否可以仅构建具有模块稳定性的二进制框架本身,并从源代码构建依赖关系。

我还尝试在Pods子项目构建设置中启用"构建用于分发的库",但这仍然不能解决问题。

有什么建议吗?

我已经想出了如何解决这个问题。

正如WWDC谈话中所建议的(但不是非常清楚(,似乎所有库依赖项都必须启用"Build Libraries for Distribution"构建设置。

椰子

Cocoapods目前没有内置的对此的支持(或者XCFrameworks(,但是,可以通过在应用程序的Podfile中添加以下内容来暂时破解:

post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
end
end
end

这将确保所有依赖项都是为分发而构建的。

迦太基

迦太基也不支持模块稳定性。您需要传递自定义的Xcode构建设置,以确保在运行carthage build时,您的框架是在启用"为分发构建库"的情况下构建的:

echo 'BUILD_LIBRARY_FOR_DISTRIBUTION=YES'>/tmp/config.xcconfig; XCODE_XCCONFIG_FILE=/tmp/config.xcconfig carthage build; rm /tmp/config.xcconfig

最新更新