静态链接库不能在运行时加载,但必须在链接可执行文件时合并到二进制文件中。这意味着静态链接库中代码的所有入口点都已明确定义,并且它们的地址不会相对于可执行代码的开头发生变化(因此是“静态的”)。
对于动态加载的库,无法知道代码将在哪里,因此当库在运行时加载时,需要一定的性能开销来“绑定”加载的代码。本质上,链接被推迟到运行时,这就是为什么它有时也被称为“后期绑定”。
您选择实施哪个取决于您的使用要求。如果您想要一个独立的可执行文件,用户可以简单地拖放到他的应用程序文件夹中而不必担心依赖关系,那么静态链接您的库可能是要走的路。
但是对于规模较大的项目,在提供大量功能的应用程序中,一次加载所有功能可能是禁止和不必要的。提供一组可动态加载的库,既可以节省内存,又可以缩短启动时间。然后,随着用户访问特性,相关代码被加载,并且可能有一段时间没有使用的特性可以被卸载。
此外,如果您对代码进行更改,您可能能够简单地重新分发一两个库,而不必重新编译、重新链接和重新分发整个可执行文件。我需要提到插件的前景吗?
上面两个模板之间的差异是微妙的。两者都根据 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(如果您需要编译遗留代码,