文章

找不到 libswiftCore.dylib

找不到 libswiftCore.dylib

背景

App 在较新的系统上正常运行,可是在 10.13 系统上启动的时候却崩溃了,原因是 libswiftCore.dylib 找不到,报错如下:

1
2
3
4
Dyld Error Message:
   Library not loaded: /usr/lib/swift/libswiftCore.dylib
   Referenced from: /Applications/XXX.app/Contents/Frameworks/MRSMB2.framework/Versions/A/MRSMB2
   Reason: image not found

有趣的最低支持版本

由于 MRSMB2 库使用 Swift 语言编写,所以依赖了 Swift 的运行时库 libswiftCore.dylib 动态库,我们知道打包的时候 Xcode 会默认拷贝一份 Swift 运行时库到 App 里,检查了下 App 里的确也有这个 libswiftCore.dylib 库,可为什么还是报错找不到这个库呢?定睛一看发现不是到 App 里查找的,而是到系统目录 /usr/lib/swift/ 路径下寻找,问题就在这了。

依赖库的路径是在打包的时候确定好的,所以先使用 otool 命令检查下这个库的依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[matt]$ otool -L MRSMB2.framework/MRSMB2
MRSMB2.framework/MRSMB2 (architecture x86_64):
	@rpath/MRSMB2.framework/Versions/A/MRSMB2 (compatibility version 1.0.0, current version 1.0.0)
	/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 3502.1.255)
	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1351.0.0)
	/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 3502.1.255)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1900.180.0)
	/usr/lib/swift/libswiftCore.dylib (compatibility version 1.0.0, current version 0.0.0)
	/usr/lib/swift/libswiftCoreFoundation.dylib (compatibility version 1.0.0, current version 120.100.0, weak)
	/usr/lib/swift/libswiftDarwin.dylib (compatibility version 1.0.0, current version 310.100.8)
	/usr/lib/swift/libswiftDispatch.dylib (compatibility version 1.0.0, current version 54.0.0)
	/usr/lib/swift/libswiftIOKit.dylib (compatibility version 1.0.0, current version 1.0.0, weak)
	/usr/lib/swift/libswiftObjectiveC.dylib (compatibility version 1.0.0, current version 940.4.0)
	/usr/lib/swift/libswiftXPC.dylib (compatibility version 1.0.0, current version 69.120.3, weak)
	@rpath/libswift_Concurrency.dylib (compatibility version 1.0.0, current version 0.0.0, weak)
	/usr/lib/swift/libswiftFoundation.dylib (compatibility version 1.0.0, current version 1.0.0)
MRSMB2.framework/MRSMB2 (architecture arm64):
	@rpath/MRSMB2.framework/Versions/A/MRSMB2 (compatibility version 1.0.0, current version 1.0.0)
	/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 3502.1.255)
	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1351.0.0)
	/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 3502.1.255)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1900.180.0)
	/usr/lib/swift/libswiftCore.dylib (compatibility version 1.0.0, current version 0.0.0)
	/usr/lib/swift/libswiftCoreFoundation.dylib (compatibility version 1.0.0, current version 120.100.0, weak)
	/usr/lib/swift/libswiftDarwin.dylib (compatibility version 1.0.0, current version 310.100.8)
	/usr/lib/swift/libswiftDispatch.dylib (compatibility version 1.0.0, current version 54.0.0)
	/usr/lib/swift/libswiftIOKit.dylib (compatibility version 1.0.0, current version 1.0.0, weak)
	/usr/lib/swift/libswiftObjectiveC.dylib (compatibility version 1.0.0, current version 940.4.0)
	/usr/lib/swift/libswiftXPC.dylib (compatibility version 1.0.0, current version 69.120.3, weak)
	@rpath/libswift_Concurrency.dylib (compatibility version 1.0.0, current version 0.0.0, weak)
	/usr/lib/swift/libswiftFoundation.dylib (compatibility version 1.0.0, current version 1.0.0)

确定无疑就是打包时确定的依赖库查找路径有问题,代码上没有什么修改,所以决定在编译时指定支持的最低系统版本为 10.13,重新编译后再次查看:

1
2
3
4
(architecture x86_64):
@rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 0.0.0)
(architecture arm64):
/usr/lib/swift/libswiftCore.dylib (compatibility version 1.0.0, current version 0.0.0)

打包重新安装,的确可以打卡了,问题解决了。可是为什么 arm64 架构始终都是从系统路径 /usr/lib/swift/ 查找呢?

于是我验证了在编译时将最低支持版本设置成 10.1410.15 ,发现从 10.15 系统开始 x86_64 架构也会从系统路径 /usr/lib/swift/ 查找,即:

1
2
3
4
(architecture x86_64):
/usr/lib/swift/libswiftCore.dylib (compatibility version 1.0.0, current version 0.0.0)
(architecture arm64):
/usr/lib/swift/libswiftCore.dylib (compatibility version 1.0.0, current version 0.0.0)

如何指定最低支持版本

顺便介绍下如何在编译时指定支持的最低版本,如果使用 xcodebuild 命令编译可通过 IPHONEOS_DEPLOYMENT_TARGET、TVOS_DEPLOYMENT_TARGET、MACOSX_DEPLOYMENT_TARGET 指定,比如:

1
2
3
4
5
6
7
xcodebuild -project MRSMB2.xcodeproj \
    -target MRSMB2 \
    -configuration Release  \
    -destination 'generic/platform=iOS' \
    -sdk iphoneos \
    IPHONEOS_DEPLOYMENT_TARGET=13.0 \
    CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO

如果使用 Clang 直接编译的,可以通过一下参数指定:

1
2
3
4
5
-miphoneos-version-min=11.0
-mios-simulator-version-min=11.0
-mmacosx-version-min=10.13
-mtvos-simulator-version-min=12.0
-mtvos-version-min=12.0

比如:

1
2
3
4
5
6
clang -fobjc-arc \
  -mmacosx-version-min=10.15 \
  -isysroot $(xcrun --sdk macosx10.15 --show-sdk-path) \
  -framework Foundation \
  main.m \
  -o app

如果是 App 的话,直接在 Xcode 里指定就可以了,以上说的是编译库时如何指定。

为什么是 10.15 呢?

因为 10.15 系统发布时,开发工具时 Xcode 11,Swift 语言版本是 5.1,ABI 已经稳定了,所以从这个系统开始苹果开始内置 Swift 运行时,如果我们的 App 最低支持版本不小于 10.15 的话,实际上就不用带 Swfit 的运行时了,这样包体积也会减少。

那为什么对于 arm64 架构而言,不管最低版本设定成多少都会从系统目录里找呢?

因为 arm64 架构只存在于苹果的 M 系列芯片,M1 芯片是 Apple 首款专为 Mac 打造的芯片,搭载了 M1 芯片的 Mac 需要使用优化的 macOS Big Sur 系统,有了 macOS Big Sur 和 M1 芯片,Mac 用户能使用的 app 数量比以往大大增加了。Apple 开发的全部 Mac 软件现均已支持 Universal,并可在 M1 系统上以原生方式运行。而现有的各种 Mac app,即使尚未更新到 Universal,也可通过 Apple 的 Rosetta 2 技术实现无缝运行。同时,iPhone 和 iPad 上的各种 app 现在也能直接在 Mac 上运行。这里的 Universal 翻译过来是通用的意思,是指同时支持 x86_64 和 arm64 两个架构。

参考链接:

  • https://www.swift.org/blog/5.1-release-process/
  • https://onevcat.com/2019/02/swift-abi/
  • https://xcodereleases.com/
  • https://developer.apple.com/documentation/macos-release-notes/macos-catalina-10_15-release-notes
  • https://developer.apple.com/documentation/Xcode-Release-Notes/xcode-11-release-notes
  • https://www.apple.com.cn/newsroom/2020/11/apple-unleashes-m1/
本文由作者按照 CC BY 4.0 进行授权

Comments powered by Disqus.

© debugly. 保留部分权利。

本站采用 Jekyll 主题 Chirpy