Swift 5 ABI 和 Module 的稳定性

Oct 02, 2022 • 预计阅读时间 1 分钟

Swift 5.0 开始,实现了 ABI 稳定性,意味着同样的源码,即使是使用不同版本的 Swift 编译, 编译后的程序都可以在 Swift 5 Runime 下运行,而不需要要求目标环境的 Runtime 和开发环境一致。

ABI 稳定性的好处就是目标环境所带的 Swift 5 runtime 可以不升级,也不需要在 App 里内置一份独立的 runtime 库。

Swift 5.1 开始,支持了 Module 稳定性。就是说使用 Swift 5.1 编译的二进制库,是具有模块稳定性的,在链接性上可以与其他版本的 Swift 兼容。

默认情况下模块稳定性是关闭的,不同版本的 Swift 编译的库是不能导入项目中直接使用,会报错:

Module compiled with Swift 5.1 cannot be imported by the Swift 5.2 compiler

在 framework 项目中打开模块稳定性的方法:

在 Xcode 的 Build Settings 设置中,把 Build Libraries for Distribution 设置为 Yes

如果是使用 Carthage 编译 framework 的,使用 xcconfig 来设置全局配置:

xcconfig=$(mktemp /tmp/zsxq.xcconfig.XXXXXX)
trap 'rm -f "${xcconfig}"' INT TERM HUP EXIT
echo 'BUILD_LIBRARY_FOR_DISTRIBUTION=YES' >> ${xcconfig}

export XCODE_XCCONFIG_FILE="$xcconfig"
carthage build --use-xcframeworks --no-use-binaries

如果在使用 Swift 命令行编译的,编译参数是:-enable-library-evolution

另外,如果在 Swift 的 framework 源码中,使用了桥接头文件混编译 Objective-C 的话,是不能开启模块稳定性的。

参考资料

https://www.swift.org/blog/library-evolution/

Swift
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

C++ 11 中的原始字符串字面量(Raw String Literal)

macOS 命令行工具编辑 plist 文件