22

我正在尝试在 Xcode 中创建 C++ 库,但不确定是选择 C/C++ 库还是 STL C++ 库选项?我注意到该STL C++ Library选项不允许您创建静态库并强制您创建动态库。但是,C/C++ Library除了创建静态库之外,该选项还允许您创建动态库。

这两个选项有什么区别,我应该什么时候使用它们?我阅读了选项下方的描述,但不幸的是它们并没有太大帮助。

另一方面,为什么静态库文件与动态库文件完全不同?似乎区别主要在于如何找到库(与您的应用程序一起打包与依赖目标机器上的存在),而不是库本身的功能或代码。如果有人能澄清这一点,那就太好了。

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

19

静态链接库不能在运行时加载,但必须在链接可执行文件时合并到二进制文件中。这意味着静态链接库中代码的所有入口点都已明确定义,并且它们的地址不会相对于可执行代码的开头发生变化(因此是“静态的”)。

对于动态加载的库,无法知道代码将在哪里,因此当库在运行时加载时,需要一定的性能开销来“绑定”加载的代码。本质上,链接被推迟到运行时,这就是为什么它有时也被称为“后期绑定”。

您选择实施哪个取决于您的使用要求。如果您想要一个独立的可执行文件,用户可以简单地拖放到他的应用程序文件夹中而不必担心依赖关系,那么静态链接您的库可能是要走的路。

但是对于规模较大的项目,在提供大量功能的应用程序中,一次加载所有功能可能是禁止和不必要的。提供一组可动态加载的库,既可以节省内存,又可以缩短启动时间。然后,随着用户访问特性,相关代码被加载,并且可能有一段时间没有使用的特性可以被卸载。

此外,如果您对代码进行更改,您可能能够简单地重新分发一两个库,而不必重新编译、重新链接和重新分发整个可执行文件。我需要提到插件的前景吗?

上面两个模板之间的差异是微妙的。两者都根据 GNU99 标准编译 C。但是 C/C++ 库模板设置 xcode 以根据 C++/GNU++0x“标准”编译 C++。C++/GNU++0x 后来在 2011 年正式发布为 C++/GNU++11。这两个模板都默认使用 libc++,但 STL C++ 模板允许您选择链接到较旧的 libstdc++。你为什么要这样做?如果您的代码链接到 libc++,但您还链接到引用 libstdc++ 的其他库,并且您遇到冲突的符号,您可以通过链接 libstdc++ 来解决此问题。STL C++ 库模板还允许您要求编译器坚持 C++11 标准,不包括 GNU++11 扩展,或者回到 C++/GNU++98(如果您需要编译遗留代码,

于 2012-11-13T10:30:20.887 回答