在链接二进制文件和库与嵌入框架中,有一个很好的问题,问这两个选项之间的区别。
看起来我们可以两种都使用,只是想知道什么情况下我们应该更好地使用嵌入式二进制文件,或者是链接的框架?
有没有明确说明这一点的具体例子?谢谢。
在链接二进制文件和库与嵌入框架中,有一个很好的问题,问这两个选项之间的区别。
看起来我们可以两种都使用,只是想知道什么情况下我们应该更好地使用嵌入式二进制文件,或者是链接的框架?
有没有明确说明这一点的具体例子?谢谢。
popen()
或类似的调用。嵌入式二进制文件可能会被您的程序调用,但它与之无关联。它是一个完全外部的实体(就像/bin
目录中的程序)。popen()
函数(从您的终端键入 man popen
以了解更多信息)允许您从另一个正在运行的程序中执行任意程序。 system()
函数是另一种方式。还有其他方法,在这里我将给出一个历史性的例子,可能会使使用嵌入式二进制文件的理解更加清晰:501
。root
用户(用户 ID 为 0
)可以完全访问整个文件系统。有时发生这样的情况,由桌面用户启动的安装程序需要在受限目录中安装文件(例如驱动程序)。在这种情况下,应用程序需要提升其权限以成为 root
用户,以便可以写入这些受限制的目录。AuthorizationExecuteWithPrivileges()
接受一个路径作为参数,该路径指向要以root
身份执行的命令行工具。命令行工具可以是你编写的可执行shell脚本或编译后的二进制文件,用于运行安装逻辑。这个工具被安装在应用程序包内,就像任何其他资源文件一样。root
身份执行程序。这个过程类似于自己使用popen()
执行程序,尽管popen()
本身并不能让您获得特权升级的好处。link
,但你说得对,你还必须通过复制文件阶段嵌入它(否则你怎么使用它呢?)。使用第三方框架或嵌入式二进制文件的目标是执行实体提供的代码。使用嵌入式二进制文件时不涉及链接。在运行时,您构造一个到二进制文件的路径,然后手动执行它。使用框架时,编译时链接器将在构建应用程序时将其链接,然后(如果它是第三方框架)通过复制文件阶段嵌入它,最后,在运行应用程序时运行时链接器再次链接它。 - par简而言之,
- 系统库,链接它们;
- 第三方库,嵌入它们。
为什么?
- 如果您尝试嵌入系统库,您将无法在弹出列表中找到它们;
- 如果您链接第三方库,可能会导致崩溃。
Xcode v11之前版本中,嵌入式二进制文件与链接的框架和库
历史
Embedded Binaries vs Linked Frameworks and Libraries -> Frameworks, Libraries, and Embedded Content
[Xcode v11. 框架、库和嵌入式内容]已替换为General
选项卡中的Xcode v11部分
嵌入式二进制文件(embedded binaries)
和链接框架(Linked Frameworks)
是依赖管理(Dependency)
的一部分[关于]
General -> Linked Frameworks and Libraries
是Build Phases -> Link Binary With Libraries
的镜像。
静态库和框架
如果您将静态库或静态框架
添加到此部分,则它将显示在Frameworks
组[关于](项目导航器(Project Navigator) -> <工作区/项目> -> Frameworks
)中,并将为其添加一个引用。然后它将被静态链接器(Static Linker)
使用。编译时,静态链接器
会将库中的所有代码包含/复制到可执行对象文件中。静态链接器
与构建设置(Build Settings) -> <Library/Framework> Search Paths
配对工作。
静态库
构建设置 -> 库搜索路径
[未找到库] 如果您不将静态库
添加到此部分,您将收到链接器错误[ld: symbol(s) not found]静态框架
构建设置 -> 框架搜索路径
。如果您不将静态框架
添加到此部分,您将收到编译错误[No such module]静态库和静态框架
对于静态库
和静态框架
而言,嵌入并没有任何意义,因为它们的符号被编译到可执行二进制文件中。Xcode不允许您在嵌入部分下放置静态库
。
动态框架
常规 -> 嵌入式二进制文件
是构建阶段 -> 嵌入框架
的镜像。
嵌入实际上是向您的应用程序包中添加框架的副本(而不是将框架和应用程序的代码合并为单个可执行二进制文件)
默认情况下,该捆绑文件夹为Frameworks
,但您可以使用Destination
字段更改它。此外,您可以指定一个Subpath
。
动态链接器:dyld
在加载或运行时会尝试使用@rpath
[关于]查找嵌入式框架。如果没有找到,将出现错误[dyld: Library not loaded]
结果:
静态库
- 链接
静态框架
- 链接
动态框架
- 嵌入