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 许可协议
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 许可协议
C++ 程序分两个阶段构建
静态库 (.lib) 只是一组 .obj 文件,因此不是一个完整的程序。它还没有经历构建程序的第二(链接)阶段。另一方面,Dll 类似于 exe,因此是完整的程序。
如果您构建一个静态库,它还没有被链接,因此您的静态库的使用者将不得不使用您使用的相同编译器(如果您使用 g++,他们将不得不使用 g++)。
相反,如果您构建了一个 dll(并且 正确 构建了它),那么您构建了一个所有消费者都可以使用的完整程序,无论他们使用的是哪个编译器。但是,如果需要交叉编译器兼容性,则从 dll 导出时有几个限制。
原文由 tcb 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
静态库会增加二进制文件中代码的大小。它们总是被加载,并且您编译的任何版本的代码都是将运行的代码版本。
动态库是单独存储和版本化的。 如果 更新被认为与原始版本二进制兼容,则可能会加载不是代码随附的原始版本的动态库版本。
此外,动态库不一定要加载——它们通常在第一次调用时加载——并且可以在使用相同库的组件之间共享(多个数据加载,一个代码加载)。
大多数时候,动态库被认为是更好的方法,但最初它们有一个重大缺陷(谷歌 DLL 地狱),最近的 Windows 操作系统(尤其是 Windows XP)几乎消除了这个缺陷。