开启Build Libraries for Distribution仍报Swift模块版本不兼容错误
问题根因
你对Build Libraries for Distribution的生效范围存在认知偏差,这个配置的作用对象是当前被编译的target本身,你在主工程Build Settings里开这个选项,只会让你自己主工程编译出的产物具备跨Swift版本兼容能力,完全影响不到Carthage拉取到的已经预编译完成的第三方依赖。
你现在遇到的报错核心逻辑很明确:
- 从报错路径看,出问题的ObjectMapper.framework存放在
Carthage/Build/iOS目录下,是Carthage拉取到的、第三方作者提前用Swift 5.2.4编译好的二进制包 - 这个二进制包在编译时没有开启
Build Libraries for Distribution,没有生成跨版本兼容必需的.swiftinterface模块描述文件,只有和Swift 5.2.4强绑定的二进制.swiftmodule文件,自然无法被Xcode 13.4自带的Swift 5.6.1编译器识别导入 - Swift 5.x版本的模块兼容能力不是默认开启的,只有编译库本身时打开对应配置,生成标准化的模块接口文件,才能实现不同小版本Swift编译器的互通,你只在主工程开配置没有任何作用。
- 你集成的ObjC写的依赖不受Swift版本兼容逻辑影响,不需要针对这个问题做额外调整。
解决步骤
按顺序执行以下操作即可修复问题:
- 先清理Carthage本地缓存和旧的编译产物,避免旧二进制文件被重复引用:
rm -rf ~/Library/Caches/org.carthage.CarthageKit rm -rf ./Carthage/Build - 创建临时编译配置文件,强制Carthage在本地编译所有依赖时自动开启
Build Libraries for Distribution,保证编译出的二进制具备跨Swift版本兼容能力:echo 'BUILD_LIBRARY_FOR_DISTRIBUTION=YES' > ./carthage_temp.xcconfig export XCODE_XCCONFIG_FILE="./carthage_temp.xcconfig" - 执行依赖更新命令,加上
--no-use-binaries参数强制Carthage在本地用当前环境的Swift编译器重新编译所有依赖,不要拉取第三方提前上传的预编译包:carthage update --use-xcframeworks --platform iOS --no-use-binaries - 依赖编译完成后,清理临时配置文件即可:
unset XCODE_XCCONFIG_FILE rm -f ./carthage_temp.xcconfig
补充说明:如果后续更新依赖重复出现同类报错,重复上述流程即可。只要保证所有Swift依赖都是用当前Xcode自带的编译器、开启模块稳定性开关在本地编译的,就不会出现Swift版本不匹配的导入错误。
内容的提问来源于stack exchange,提问作者Zek
相关产品推荐
相关产品推荐

