iOS引入Masonry库编译报错libarclite_iphonesimulator.a
背景
引入Masonry编译报错如下:
File not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a
Linker command failed with exit code 1 (use -v to see invocation)
这是非常常见的问题,自我第一次使用Masonry库就有这个错误。但是觉得很奇怪,Masonry作为一个广泛使用的成熟库,为什么引入还会报错,这也太low了吧?
今天建立新项目,引入Masonry库,又报错,接二连三的遇到该问题让我开始正视了这个问题。
解决方案
方案1 临时方案:
xcworkspace工程中选择Pods工程,Targets下选择Masonry库,将minimum deployments最新部署版本升级至 >= 9.0即可。
方案2 推荐方案:
方案1 缺点:直接修改Pods工程中的配置并不是最佳方案,因为当你下次执行 pod update
或 pod install
时,这些更改可能会被覆盖。如果你确实需要对某- 使用 post_install
hook:可以在你的 Podfile
中添加脚本,在安装或更新 Pods 后自动修改某些 Targets 的设置。些 Pod 进行自定义配置,推荐的做法是:
修改Podfile文件,对Masonry库的最低部署版本进行设置。
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == 'Masonry'
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
end
end
end
end
为什么引入Masonry编译会报错
File not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a
这个错误的核心含义是:
找不到 ARC(Automatic Reference Counting)支持库
libarclite_iphonesimulator.a
而通过将 Masonry Pod 的 Deployment Target 从 iOS 8.0
改为 iOS 11.0
后,问题解决了。
为什么会出现 libarclite_iphonesimulator.a
找不到?
- 这个文件是 Apple 提供的一个静态库,用于模拟器环境下支持 ARC(自动内存管理) 。
- 它只在某些旧版本的 iOS 部署目标下才会被链接进来(通常是 iOS 8~9)。
- 从 iOS 9.0 起,ARC 已经成为默认行为,不再需要手动链接这个库。
- Xcode 从某个版本开始(尤其是 Xcode 12+),已经移除了对
libarclite_iphonesimulator.a
的支持,所以如果你仍然试图链接它,就会报错。
❓ 为什么是 Masonry 导致这个问题?
Masonry 本身是 Objective-C 编写的库,并且它的 .podspec
文件里可能指定了较低的 deployment target(如 iOS 8.0
)。这会导致 CocoaPods 在生成 Pod Target 时:
- 自动添加
-fobjc-arc
标志; - 并尝试链接
libarclite_iphonesimulator.a
来兼容非 ARC 环境; - 但由于你的 Xcode 已经不包含该库,就导致了链接失败。
✅ 为什么改到 iOS 11.0 就好了?
这样会:
- 不再要求链接
libarclite_iphonesimulator.a
; - 让编译器知道这是一个现代的、默认启用 ARC 的环境;
- 因此不会触发这个已废弃的链接行为。
🧪 补充说明:libarclite 是什么?
-
libarclite
是 Apple 为了向后兼容,在早期 iOS 版本上支持 ARC 的“过渡性”库。 - 当你在 iOS 5~8 上开发 Objective-C 项目时,如果项目或某些文件未启用 ARC,Xcode 会自动链接这个库来启用局部 ARC。
- 但自从 iOS 9 之后,Apple 强制所有 App 必须使用 ARC,因此这个库就被淘汰了。
最终建议
- 保持 Pod 的最低部署目标与主工程一致;
- 避免使用低于 iOS 10.0 的 deployment target(除非你有特殊需求);
- 使用
post_install
统一管理 Pod 的构建设置; - 如果你使用 Swift 和 Objective-C 混合编程,更应统一构建配置以避免冲突。
为什么Masonry不提高最低部署版本?
既然有错误,那为什么Masonry库不把最低版本8.0升级呢? Masonry 库维持较低的 iOS 部署目标(如 iOS 8.0)主要是为了最大化兼容性,使得尽可能多的项目能够使用该库,包括那些需要支持旧版 iOS 系统的应用。然而,这种做法有时会导致与最新版本的 Xcode 或其他工具链不完全兼容的问题,就像我遇到的情况一样。
维持低部署目标的原因
- 广泛兼容性: 许多开发者可能仍在维护和支持需要运行在较老版本 iOS 上的应用程序。通过保持较低的最低部署目标,Masonry 可以确保这些应用可以无缝集成 Masonry 而无需升级其操作系统支持。
- 社区需求: 如果大部分用户仍然需要支持 iOS 8.0 或更高版本但低于最新版本的操作系统,那么提高最低部署目标可能会导致部分用户无法使用更新版本的库。
- 稳定性考虑: 对于一个成熟且功能稳定的库来说,频繁更改最低部署目标可能导致不必要的回归测试和潜在问题,特别是对于那些依赖于特定版本行为的应用。