“嗖——应用崩溃了”:认识 dyld: Library not loaded: @rpath/libswiftCore.dylib
\n\n你是否曾经启动过自己的 Swift 应用,看到了漂亮的启动画面,然后——砰!——黑屏和满是红色字符的控制台?熟悉吗?如果你至少遇到过 dyld: Library not loaded: @rpath/libswiftCore.dylib 这条消息,你就会知道那种轻微的恐慌感。在 Stack Overflow 上,这个问题已经积累了数千次浏览,这并非没有原因:这个错误很棘手,但完全可以解决。
在这篇文章中,我们不仅会给出干巴巴的说明。我们还会分析为什么 Swift 库会在运行时“丢失”,如何避免这种情况,以及如果你已经陷入困境该怎么办。开始吧!
\n\n什么是 dyld,它为什么生气?
\n\ndyld(动态链接编辑器)是 macOS 和 iOS 中的动态库加载器。当你的应用启动时,dyld 会根据二进制文件中指定的路径查找所有必需的库。其中一个路径是 @rpath(运行时搜索路径)。如果库(例如 libswiftCore.dylib)在该路径下未找到,dyld 就会崩溃并报错。
简单来说:你告诉应用“从 @rpath 书架上拿一本书”,但书架是空的。整个谜团就是这样。
\n\n为什么这偏偏发生在 libswiftCore.dylib 上?
\n\nlibswiftCore.dylib 是 Swift 运行时的核心。没有它,任何 Swift 代码都无法运行。该错误最常见于三种情况:
- \n
- 你使用 Xcode 14+,但项目配置为旧版 Swift。 \n
- 你连接了需要特定 Swift 运行时版本的 框架或 CocoaPods。 \n
- 你忘记在构建设置中启用“Always Embed Swift Standard Libraries”。 \n
修复 dyld: Library not loaded: @rpath/libswiftCore.dylib 的 5 种方法
\n\n让我们进入实践环节。以下是经过验证的方法,从简单到复杂。每种方法我都会提供代码或设置示例。
\n\n1. 启用“Always Embed Swift Standard Libraries”
\n\n最常见的罪魁祸首。如果你的应用没有将 Swift 库嵌入到 bundle 中,dyld 将无法在设备上找到它们。
\n\n如何修复:
\n- \n
- 在 Xcode 中打开项目。 \n
- 选择 Target → Build Settings。 \n
- 找到
Always Embed Swift Standard Libraries。 \n - 将其值设置为
Yes。 \n
如果你使用 CocoaPods,请检查 Podfile 中是否有禁用此行为的行:
# 不好(可能导致错误)\npost_install do |installer|\n installer.pods_project.targets.each do |target|\n target.build_configurations.each do |config|\n config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'NO'\n end\n end\nend\n\n# 好\npost_install do |installer|\n installer.pods_project.targets.each do |target|\n target.build_configurations.each do |config|\n config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'YES'\n end\n end\nend\n\n\n2. 检查 Swift 版本兼容性
\n\n如果你连接了一个为 Swift 5.7 编译的框架,而你的项目使用的是 Swift 5.5——你好,错误。Swift 运行时并非“100%”向后兼容。
\n\n解决方案:确保所有依赖项使用相同的 Swift 版本。打开终端并执行:
\n\n# 查看特定 .framework 的 Swift 版本\nstrings MyFramework.framework/MyFramework | grep "Swift"\n# 或者通过 xcrun 检查\nxcrun swift --version\n\n\n如果框架是为不同版本编译的——请重新编译它或进行更新。
\n\n3. 清理 Derived Data 并重新构建项目
\n\n有时 Xcode 会缓存旧的库路径。完全重新构建通常可以解决问题。
\n\n# 手动删除 Derived Data\nrm -rf ~/Library/Developer/Xcode/DerivedData