iOS中的框架包含静态库还是动态库?

6
我曾在多个网站上看到框架可以包含静态和动态库的描述。但如何辨别框架实际包含的是动态库还是静态库呢?我考虑先查看扩展名(.a表示静态库,.dylib表示动态库),但我试验的框架里没有提供任何二进制文件的扩展名。是否有其他方法可以确定它是静态库还是动态库?
此外,我读了Landon Fuller关于静态库 http://landonf.bikemonkey.org/code/ios/Radar_15800975_iOS_Frameworks.20140112.html 的文章。他提到框架为库提供了两级命名空间,但这是否也适用于普通的调试符号,而不仅仅是依赖项?即使框架中打包了静态库,它是否也能起作用?
举个例子,如果我在框架内和项目代码库中都有同样的调试符号,那么会怎样呢?两级命名空间是否能够在这种情况下工作?
根据此作者http://ddeville.me/2014/04/dynamic-linking/所述,框架是包含动态库、头文件和资源的捆绑包或软件包。
根据以下帖子Library? Static? Dynamic? Or Framework? Project inside another project所述,框架可以包含静态和动态库。
我对此感到非常困惑。有人能解释一下iOS中的框架包含什么以及在两级命名空间方面如何工作吗?
2个回答

4

检查是静态还是动态

判断文件扩展名是否明确很简单。

  • .a - 静态库
  • .dylib - 动态库

变体1:

要查看库类型:在 .framework 文件夹中找到二进制文件。使用 file 命令检查二进制文件,例如:

file /some_path/<framework_name>.framework/<framework_name>

//possible results
current ar archive random library //static library
dynamically linked shared library //dynamic library

*在构建设置中可以更改Mach-O类型[关于]静态库目标更改为动态库,结果将生成一个.a文件。使用file命令将显示动态链接共享库,但它实际上是静态库。

变体2:[otool静态或动态]

*具有相同的副作用

[词汇表]
[静态与动态框架]


所以一个框架要么作为静态库资源,要么作为动态库资源。这是由“Mach-O类型”的值设置的。对吧?那么我不明白接下来你需要做什么才能得到这样一种情况:“file”命令将显示动态链接共享库,但它实际上是静态库。你能解释一下吗? - mfaani

3

回答你的第一个问题,是的,你的理解是正确的,框架只是一个目录结构,它捆绑了库镜像(已编译的机器代码、头文件、资源等)。要验证框架是否实际上是静态库或动态库,请使用以下命令:

file Path/To/YourLib.framework/YourLib

如果某个架构(armv7、arm64等)的输出显示为ar archive,则它是静态库;反之,如果对于任何架构都显示为dynamically linked shared library,则它显然是动态库。
如果您自己创建框架项目,可以通过设置项目的Mach-O Type构建设置来选择构建静态或动态镜像。
如果同一符号(例如函数名)在多个地方定义,则有不同的可能性。在几乎所有情况下,行为都会引发链接时错误,抱怨有多个符号异常被动态链接框架定义,这种情况下您可能会看到不一致的行为,其中一个符号将从最先加载到内存中的动态框架中加载。

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