XCode中的C/C++库和STL C++库有什么区别?

Ton*_*ony 20 c++ xcode shared-libraries static-libraries

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

这两个选项之间的区别是什么?我应该在何时使用它们?我阅读了选项下面的描述,但不幸的是它们并没有非常有用.

另外,为什么静态库文件与动态库文件完全不同?似乎差异主要在于如何找到库(与您的应用程序一起打包而不是依赖于目标计算机上的状态),而不是在库本身的功能或代码中.如果有人能澄清这一点,那就太棒了.

在此输入图像描述

在此输入图像描述

小智 18

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

使用动态加载的库,无法知道代码的位置,因此在运行时加载库时,需要一定的性能开销来"绑定"加载的代码.从本质上讲,链接被推迟到运行时,这就是为什么它有时也被称为"后期绑定".

您选择实施哪些取决于您的使用要求.如果你想要一个自包含的可执行文件,用户可以简单地拖放到他的应用程序文件夹中而不必担心依赖关系,那么静态链接你的库可能就好了.

但对于规模较大的项目,在提供大量功能的应用程序中,一次加载所有功能可能过于庞大而且没有必要.提供一组可动态加载的库既可以节省内存,又可以缩短启动时间.然后,当用户访问特征时,加载相关代码,并且可能卸载可能暂时未使用的特征.

此外,如果您对代码进行了更改,则可能只需重新分发一个或两个库,而不必重新编译和重新链接并重新分发整个可执行文件.我需要提一下插件的前景吗?

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