繁体   English   中英

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

[英]What's the difference between C/C++ Library and STL C++ Library in XCode?

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

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

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

在此输入图像描述

在此输入图像描述

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

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

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

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

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

上面两个模板之间的差异很微妙。 两者都根据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(如果您需要编译遗留代码,例)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM