静态链接库不能在运行时加载,但必须纳入到你的二进制文件,当你链接您的可执行文件。这意味着静态链接库中的代码的所有入口点都已定义好,并且它们的地址相对于可执行代码的开头(即“静态”)不会改变。
对于动态加载的库,无法知道代码将在哪里,所以当库在运行时加载时,需要一定的性能开销来“绑定”加载的代码。本质上,链接被推迟到运行时间,这就是为什么它有时也被称为“后期绑定”。
您选择实施哪个取决于您的使用要求。如果你想要一个自包含的可执行文件,用户可以简单地拖放到他的应用程序文件夹中,而不必担心依赖关系,静态链接你的库可能是一条可行的路。
但是对于规模较大的项目,在提供大量功能的应用程序中,一次加载所有功能可能过于禁止且不必要。提供一组可动态加载的库可以节省内存并缩短启动时间。然后,随着用户访问特征,加载相关的代码,并且可能卸载可能暂时未被使用的特征。
此外,如果您对代码进行了更改,您可能只需重新分配一个或两个库,而不必重新编译并重新链接并重新分发整个可执行文件。我需要提到插件的前景吗?
上述两个模板之间的差异很微妙。两者都根据GNU99标准编译C.但是C/C++库模板根据C++/GNU ++ 0x“标准”设置xcode来编译C++。 C++/GNU ++ 0x后来在2011年正式发布为C++/GNU ++ 11。这两个模板默认使用libC++,但STL C++ Template允许您选择链接到较早的libstdC++。你为什么要这样做?如果您的代码与libC++链接,但是您还链接到引用libstdC++的其他库,并且您运行的是冲突符号,则可以通过链接到libstdC++来解决此问题。 STL C++库模板还允许您请求编译器坚持使用C++ 11标准(不包括GNU ++ 11扩展),或者返回到C++/GNU ++ 98(如果您需要编译遗留代码,例)。
libC++ vs libstdC++也许? – Praetorian