iOS是一个静态还是动态框架?

62

这可能听起来像个愚蠢的问题,但如果你有一个thirdParty.framework文件,你能否知道它是静态的还是动态的?我的意思是,如果你打开它看一下,它们看起来不同吗?

2个回答

139

它可能是两者之一。

然而,只有iOS8及以上版本才允许在应用程序包中使用动态框架。

查找的方法是查看.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归档文件的意思是“静态库”。

或者,“动态”框架将会是这样,并明确声明其是动态链接的。

$ 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

请问您能否详细说明一下“在主文件上使用file命令”的意思?我需要在终端中调用吗? - Hadi tavakoli
当将动态框架链接到应用程序中时,是否需要使用“嵌入式库”?我在启动时遇到了运行时错误 dyld __abort_with_payload ,这表明库链接不正确。令人困惑的是,如果我将它放在“嵌入式库”中,它可以工作,但是如果我立即再把它拿出来,它仍然可以工作。发生了一些我不理解的微妙问题。 - Jim Leask
1
你能澄清一下第二个终端会话显示的是什么吗?我假设它显示的是一个动态框架的输出,但在答案中没有明确说明。 - Adam Johns

14

我使用此命令列出给定路径中所有的静态框架:

find -E . -type f -iregex ".*\.framework\/[^./]*" -exec file {} \; | grep ': current ar archive' | sed 's/.*\/\(.*.framework\).*/\1/'

1
感谢您移除了“current ar archive”前面的冒号,使其正常工作。终端输出带有制表符,这在网站上复制粘贴时不太方便。 - Stijn
我应该在哪个目录级别下运行这个程序? - Hlung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接