ios中的框架包含

时间:2015-11-04 12:35:19

标签: ios frameworks static-libraries dynamic-library

我遇到过多个网站,描述了框架既可以包含静态库,也可以包含动态库。但是,如何确定框架实际包含的是动态库还是静态库。我想到了第一个获得扩展的帮助(.a用于静态库,.dylib用于动态库)但是我在框架中看到的所有我正在试验的是没有为打包在里面的二进制文件提供扩展。有什么方法可以确定它是静态库还是动态库。

我也读过Landon Fuller关于静态库http://landonf.bikemonkey.org/code/ios/Radar_15800975_iOS_Frameworks.20140112.html的帖子 他提到框架为库提供了两个级别的命名空间,但它覆盖了正常的调试符号而不仅仅是依赖项,它是否适用于在框架内打包的静态库。

E.x。如果我在框架内以及与之链接的项目代码库中具有相同的调试符号,会发生什么。在这种情况下,两级命名空间是否有效。

同样根据这位作者http://ddeville.me/2014/04/dynamic-linking/ framework是包含动态库,头文件和资源的包或包。

根据以下帖子Library? Static? Dynamic? Or Framework? Project inside another project 它说框架可以包含静态库和动态库。

我对此很困惑。有人可以在iOS中解释它们包含的内容以及它们如何在两级命名空间中工作。

2 个答案:

答案 0 :(得分:3)

确定文件扩展名何时显式很简单

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

您可以使用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 type [About]Static Library target更改为Dynamic library,因为将生成.a文件,{ {1}}命令向您显示file,但这将是静态库

[Vocabulary]
[Static vs dynamic framework]

答案 1 :(得分:1)

要回答问题的第一部分,是的,您的理解是正确的,框架只是捆绑库图像的目录结构(编译的机器代码,标题,资源等)。验证Framework是否实际上是静态库或动态使用以下命令

file Path/To/YourLib.framework/YourLib

如果某个特定体系结构(armv7,arm64等)的输出表示ar archive是静态库,另一方面,如果对于任何体系结构,它会显示dynamically linked shared library,那么它的动态库就不足为奇了。< / p>

如果您自己创建框架项目,可以通过设置项目的Mach-O Type构建设置来选择构建静态或动态图像。

如果在多个位置定义了相同的符号(例如,用于例如函数名称),则存在不同的可能性。在几乎所有情况下,行为都会导致链接时错误抱怨多个符号异常是动态链接的框架,在这种情况下,您可能会看到不一致的行为,其中符号将从首先加载到内存中的动态框架加载。