何时使用动态库和静态库

半世苍凉 提交于 2020-02-26 08:17:46

在C ++中创建类库时,可以选择动态( .dll.so )和静态( .lib.a )库。 它们之间有什么区别,何时适合使用哪种?


#1楼

如果您的库将在多个可执行文件之间共享,那么使其动态化以减小可执行文件的大小通常是有意义的。 否则,一定要让它静止。

使用dll有几个缺点。 加载和卸载它还有额外的开销。 还有一个额外的依赖。 如果您更改dll以使其与您的执行不兼容,它们将停止工作。 另一方面,如果更改静态库,则使用旧版本的已编译可执行文件不会受到影响。


#2楼

静态库被编译到客户端。 在编译时使用.lib,并且库的内容成为使用可执行文件的一部分。

动态库在运行时加载,不会编译到客户端可执行文件中。 动态库更灵活,因为多个客户端可执行文件可以加载DLL并利用其功能。 这还可以将客户端代码的总体大小和可维护性降至最低。


#3楼

静态库会增加二进制代码的大小。 它们总是被加载,并且您编译的代码的任何版本都是将运行的代码的版本。

动态库分别存储和版本化。 如果更新被认为与原始版本二进制兼容,则可能会加载一个与您的代码一起提供的原始动态库版本。

另外,动态库不一定要加载 - 它们通常在第一次调用时加载 - 并且可以在使用相同库的组件之间共享(多个数据加载,一个代码加载)。

大多数时候动态库被认为是更好的方法,但最初他们有一个主要的缺陷(谷歌DLL地狱),它已被最近的Windows操作系统(特别是Windows XP)淘汰。


#4楼

必须将静态库链接到最终的可执行文件中; 它成为可执行文件的一部分,无论它在哪里都跟随它。 每次执行可执行文件时都会加载动态库,并将其作为DLL文件与可执行文件分开。

如果希望能够更改库提供的功能而不必重新链接可执行文件(只需替换DLL文件,而不必替换可执行文件),就可以使用DLL。

只要您没有理由使用动态库,就可以使用静态库。


#5楼

静态库是包含库的目标代码的归档,当链接到将代码编译到可执行文件中的应用程序时。 共享库的不同之处在于它们不会编译到可执行文件中。 而是动态链接器搜索一些目录,寻找它需要的库,然后将其加载到内存中。 多个可执行文件可以同时使用同一个共享库,从而减少内存使用量和可执行文件大小。 但是,随后可以使用可执行文件分发更多文件。 您需要确保将库安装到链接器可以找到它的某个使用系统上,静态链接可以消除此问题,但会导致更大的可执行文件。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!