2012-10-18 68 views
19

我想在Xcode中创建一个C++库,我不确定是否选择C/C++库或STL C++库选项?我注意到STL C++ Library选项不允许你创建一个静态库并强制你创建一个动态库。但是,除了创建静态库之外,C/C++ Library选项还允许您创建动态库。XCode中的C/C++库和STL C++库有什么区别?

这两个选项之间有什么区别,我应该什么时候使用每个选项?我阅读下面的选项的说明,但不幸的是,他们并不是非常有帮助。

另一个说明,为什么静态库文件根本不同于动态库文件?看起来不同之处主要在于如何找到库(与您的应用程序一起打包,还是依赖目标机器上的存在),而不是库的功能或代码本身。如果有人能够澄清这一点,这将是非常棒的。

enter image description here

enter image description here

+0

libC++ vs libstdC++也许? – Praetorian

回答

17

静态链接库不能在运行时加载,但必须纳入到你的二进制文件,当你链接您的可执行文件。这意味着静态链接库中的代码的所有入口点都已定义好,并且它们的地址相对于可执行代码的开头(即“静态”)不会改变。

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

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

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

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

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

相关问题