dll,lib,.a,.so的联系与区别。什么是共享库?与dll的区别是什么?

dll,lib,.a,.so的联系与区别。什么是共享库?与dll的区别是什么?

  • 区别与联系
    • 静态库与动态库
    • 问题
    • 疑问:什么是共享存档?
    • 其他内容(map,pdb)文件

区别与联系

   本文结合所学和理解进行简单了描述dll与lib,.a,.so文件的关系与区别。同时对自己学习过程的疑问进行解答记述。
   dll,与lib是Windows下描述封装代码库的一种格式,.a,.so是linux下的。dll与.so是动态库,lib与.a是静态库。

静态库与动态库

静态库(lib,.a)是以静态的方式(隐式方式)将lib文件加载到可执行文件中。通常需要在使用时包含其头文件和在链接设置中设置加载此静态库。
动态库(dll,.so)可以用(1)静态方式(隐式方式)或者(2)动态链接的方式加载到可执行文件中。以静态方式加载相同,需要在链接设置中配置dll的lib或者.so的.a文件。如果是以动态加载方式则需要dlopen等接口去加载dll或者.so。两者的区别是动态加载是在程序启动后根据程序实际情况进行加载dll。静态加载在链接阶段便已经将接口地址等信息加载到可执行文件中。
静态库与动态库的区别:静态库将代码,符号等信息都编译到了lib文件中。所以如果程序使用,就必须要链接lib库。同时,多个程序之间不能分享lib库。动态库可以在多个程序见使用一份dll,减少资源浪费。

问题

(1)一般在制作动态库时也会有lib文件或者是.a文件的产生,这些与静态库的文件有什么不同?
答:动态库的lib文件大小要比静态库的小很多,说明信息没有那么多,动态库的lib叫导出库。里面只包含了接口地址一些基本信息,没有实现等信息。而因为dll可以通过动态加载,其实在dll中也有函数地址。
(2)什么叫共享库?与dll的区别是什么?
此篇内容写得比较好。
https://qastack.cn/programming/9688200/difference-between-shared-objects-so-static-libraries-a-and-dlls-so
对于区别总结:(1).so共享库在构建程序时,或者说是在链接时,需要已经存在。而dll库不必出现。只要在dlopen后会加载打开。或者静态链接时应该也不需要dll。(2)两个作用相同,在导出库时,DLL可以定义两种功能:出口和内部。导出的函数旨在由其他模块以及在定义它们的DLL内部调用。内部函数通常仅应从定义它们的DLL内部调用。Linux上的SO库不需要特殊的export语句来指示可导出的符号,因为所有符号都可用于询问过程。

疑问:什么是共享存档?

todo,在上述的链接中也有描述,和静态库类似。

其他内容(map,pdb)文件

map文件记录了程序中的数据,变量,函数的地址,数据存放区域。如果程序发生奔溃,则可以通过奔溃的地址在map文件中判断崩溃的程序位置。需要在链接中开启生成map文件的设置。
pdb文件是bebug模式下的调试信息。有次文件才能调试程序。记录了变量位置,函数1地址等。

你可能感兴趣的:(c++,linux,dll)