【发布时间】:2015-12-12 01:16:26
【问题描述】:
这听起来像是一个愚蠢的问题,但是如果您有一个 thirdParty.framework 文件,您能分辨它是静态的还是动态的?我的意思是,如果你往里面看,它们看起来会不一样吗?
【问题讨论】:
标签: ios objective-c static-linking dynamic-linking
这听起来像是一个愚蠢的问题,但是如果您有一个 thirdParty.framework 文件,您能分辨它是静态的还是动态的?我的意思是,如果你往里面看,它们看起来会不一样吗?
【问题讨论】:
标签: ios objective-c static-linking dynamic-linking
两者都可以。
不过,只有 iOS8+ 允许在 app bundle 中使用动态框架。
找出方法是查看.framework,并在主文件上使用file命令:
$ cd iOS/Crashlytics.framework
$ ls -l
total 9984
-rwxr-xr-x 1 andy staff 4710656 11 Sep 17:11 Crashlytics
drwxr-xr-x 8 andy staff 272 11 Sep 17:11 Headers
-rw-r--r-- 1 andy staff 1553 11 Sep 17:11 Info.plist
drwxr-xr-x 3 andy staff 102 11 Sep 17:11 Modules
-rwxr-xr-x 1 andy staff 146164 11 Sep 17:11 run
-rwxr-xr-x 1 andy staff 241688 11 Sep 17:11 submit
$ file Crashlytics
Crashlytics: Mach-O universal binary with 5 architectures
Crashlytics (for architecture armv7): current ar archive random library
Crashlytics (for architecture armv7s): current ar archive random library
Crashlytics (for architecture i386): current ar archive random library
Crashlytics (for architecture x86_64): current ar archive random library
Crashlytics (for architecture arm64): current ar archive random library
ar archive 表示“静态库”。
或者,“动态”框架看起来像这样,并明确声明它是动态链接的。
$ cd /Library/Frameworks/iTunesLibrary.framework/
$ ls -l
total 40
lrwxr-xr-x 1 root wheel 24 10 Sep 17:38 Headers -> Versions/Current/Headers
lrwxr-xr-x 1 root wheel 24 10 Sep 17:38 Modules -> Versions/Current/Modules
lrwxr-xr-x 1 root wheel 26 10 Sep 17:38 Resources -> Versions/Current/Resources
drwxr-xr-x 4 root wheel 136 10 Sep 17:41 Versions
lrwxr-xr-x 1 root wheel 22 10 Sep 17:38 XPCServices -> Versions/A/XPCServices
lrwxr-xr-x 1 root wheel 30 10 Sep 17:38 iTunesLibrary -> Versions/Current/iTunesLibrary
$ file Versions/Current/iTunesLibrary
Versions/Current/iTunesLibrary: Mach-O universal binary with 2 architectures
Versions/Current/iTunesLibrary (for architecture i386): Mach-O dynamically linked shared library i386
Versions/Current/iTunesLibrary (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
【讨论】:
dyld __abort_with_payload,这意味着该库未正确链接。令人困惑的是,如果我把它放在嵌入式库中,它可以工作,但如果我立即再次取出它,它仍然可以工作。发生了一些我不明白的微妙事情。
我使用此命令从具有框架列表的路径中列出所有 STATIC 框架:
find -E . -type f -iregex ".*\.framework\/[^./]*" -exec file {} \; | grep ': current ar archive' | sed 's/.*\/\(.*.framework\).*/\1/'
【讨论】:
current ar archive 之前删除了 : 以使其正常工作。带有标签的终端输出,不适合在网站上复制/粘贴内容。