何时使用动态库与静态库

新手上路,请多包涵

When creating a class library in C++, you can choose between dynamic ( .dll , .so ) and static ( .lib , .a ) libraries .它们之间有什么区别,什么时候适合使用?

原文由 Morten Christiansen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 866
2 个回答

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

动态库是单独存储和版本化的。 如果 更新被认为与原始版本二进制兼容,则可能会加载不是代码随附的原始版本的动态库版本。

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

大多数时候,动态库被认为是更好的方法,但最初它们有一个重大缺陷(谷歌 DLL 地狱),最近的 Windows 操作系统(尤其是 Windows XP)几乎消除了这个缺陷。

原文由 Orion Adrian 发布,翻译遵循 CC BY-SA 2.5 许可协议

C++ 程序分两个阶段构建

  1. 编译 - 生成目标代码 (.obj)
  2. 链接 - 生成可执行代码(.exe 或 .dll)

静态库 (.lib) 只是一组 .obj 文件,因此不是一个完整的程序。它还没有经历构建程序的第二(链接)阶段。另一方面,Dll 类似于 exe,因此是完整的程序。

如果您构建一个静态库,它还没有被链接,因此您的静态库的使用者将不得不使用您使用的相同编译器(如果您使用 g++,他们将不得不使用 g++)。

相反,如果您构建了一个 dll(并且 正确 构建了它),那么您构建了一个所有消费者都可以使用的完整程序,无论他们使用的是哪个编译器。但是,如果需要交叉编译器兼容性,则从 dll 导出时有几个限制。

原文由 tcb 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题