静态库lib与动态库dll详细解析

静态库:在链接步骤中,连接器将库文件取得所需的代码,复制到生成的可执行文件中,这种库叫做静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余。 即静态库中的指令全部被直接包含在最终生成的exe文件中。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件。

动态库:动态库链接是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行的文件,动态库提供一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL中,该DLL中包含一个或者多个已经被编译,链接并使用它们的进程分开存储的函数,在vs中新建生成动态库的工程,编译成功后,产生一个.lib和一个.dll文件。

静态库的lib:该lib包含函数的代码本身(包括函数的索引,也包括实现),在编译的时候将代码加入程序当中。

动态库的lib:该lib包含了函数所在的DLL文件和文件中函数位置的信息,函数实现代码由运行的时候加载在进程空间中DLL提供,总之,lib是编译的时候用到的,如果完成源代码的编译,只需要lib,如果要使得动态库的程序运行起来,只需要dll。

静态库.a(win下是lib) 和动态库.so(win下是.dll),所谓静态,动态是指链接,回顾下,将一个程序编译成可执行的步骤:
在这里插入图片描述
静态库在程序编译的时候会被链接到目标代码中,程序运行的时候不需要该静态库。

静态库特点:

静态库对函数库的链接是放在编译期完成的,程序在运行的时候与函数库再无瓜葛,移植方便。

缺点:浪费空间与资源,因为所有相关的目标文件与牵扯到的函数库会被合成一个可执行的文件。

是静态库对程序的更新,部署和发布会带来麻烦,如果静态库更新,所有使用它的应用程序程序都需要重新编译,发布给用户。

动态库特点:

动态库把一些库函数的链接载入推迟到程序运行的时期,可以实现进程之间的资源共享。

将实现进程之间的资源共享,将一些程序升级变得简单。甚至可以真正做到链接载入完全由程序代码中控制(显示调用)

gcc -o 与gcc -c的区别,gcc -o是将.c源文件编译成一个可执行的二进制代码,这包括调用GCC内的一部分真正的C编译器,以及调用GNU C编译器的输出中实际可执行的代码的外部GNU汇编器和链接工具,而**-c是使用GNU汇编器将源文件转换为目标代码之后就结束,在这种情况下连接器并没有被执行**,所以输出的目标文件不会包含作为linux程序在被装载和执行的时候所必须的信息。

windows静态库与动态库的生成:

工具: VS2017

静态库的生成: 文件—>新建—>项目—>静态库—>编写头文件以及相应的实现文件—>编译得到静态库lib

动态库的生成: 文件—>新建—>项目—>动态库—>编写头文件以及相应的实现文件—>编译得到动态库
PS: 动态库里的函数,类; 只有被导出的函数和类才能被外界使用
导出的方法:
1.dllexport,默认以c++的方式导出,导出函数会经过名字改编 extern “C”
2.通过def导出 以c的方式导出,导出的函数名是纯粹的名字

Linux静态库与动态库的生成:
请参考:链接

文章参考:
1. https://blog.csdn.net/googler_offer/article/details/88526962

2. https://blog.csdn.net/qq_39584315/article/details/80311454

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值