在C ++中创建类库时,可以选择动态( .dll
, .so
)和静态( .lib
, .a
)库。 它们之间有什么区别,何时适合使用哪种?
#1楼
如果您的库将在多个可执行文件之间共享,那么使其动态化以减小可执行文件的大小通常是有意义的。 否则,一定要让它静止。
使用dll有几个缺点。 加载和卸载它还有额外的开销。 还有一个额外的依赖。 如果您更改dll以使其与您的执行不兼容,它们将停止工作。 另一方面,如果更改静态库,则使用旧版本的已编译可执行文件不会受到影响。
#2楼
静态库被编译到客户端。 在编译时使用.lib,并且库的内容成为使用可执行文件的一部分。
动态库在运行时加载,不会编译到客户端可执行文件中。 动态库更灵活,因为多个客户端可执行文件可以加载DLL并利用其功能。 这还可以将客户端代码的总体大小和可维护性降至最低。
#3楼
静态库会增加二进制代码的大小。 它们总是被加载,并且您编译的代码的任何版本都是将运行的代码的版本。
动态库分别存储和版本化。 如果更新被认为与原始版本二进制兼容,则可能会加载一个与您的代码一起提供的原始动态库版本。
另外,动态库不一定要加载 - 它们通常在第一次调用时加载 - 并且可以在使用相同库的组件之间共享(多个数据加载,一个代码加载)。
大多数时候动态库被认为是更好的方法,但最初他们有一个主要的缺陷(谷歌DLL地狱),它已被最近的Windows操作系统(特别是Windows XP)淘汰。
#4楼
必须将静态库链接到最终的可执行文件中; 它成为可执行文件的一部分,无论它在哪里都跟随它。 每次执行可执行文件时都会加载动态库,并将其作为DLL文件与可执行文件分开。
如果希望能够更改库提供的功能而不必重新链接可执行文件(只需替换DLL文件,而不必替换可执行文件),就可以使用DLL。
只要您没有理由使用动态库,就可以使用静态库。
#5楼
静态库是包含库的目标代码的归档,当链接到将代码编译到可执行文件中的应用程序时。 共享库的不同之处在于它们不会编译到可执行文件中。 而是动态链接器搜索一些目录,寻找它需要的库,然后将其加载到内存中。 多个可执行文件可以同时使用同一个共享库,从而减少内存使用量和可执行文件大小。 但是,随后可以使用可执行文件分发更多文件。 您需要确保将库安装到链接器可以找到它的某个使用系统上,静态链接可以消除此问题,但会导致更大的可执行文件。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3162579