首页 > 解决方案 > 为 Swift 二进制框架启用模块稳定性时 dyld 崩溃

问题描述

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

我的设置如下:

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

但是,当我尝试从任何应用程序使用此框架时,dyld使用__abort_with_payload.

我在以下情况下尝试过:

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

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

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

我还尝试在 Pods 子项目构建设置中启用“构建库以进行分发”,但这仍然不能解决问题。

有什么建议么?

标签: iosswiftxcode

解决方案


我已经弄清楚如何解决这个问题。

正如 WWDC 演讲中所建议的(但不是很清楚),似乎所有库依赖项都必须启用“构建库以进行分发”构建设置。

可可足类

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

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

迦太基

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

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

推荐阅读