传统艺能😎
小编是双非本科大二菜鸟不赘述,欢迎米娜桑来指点江山哦
1319365055
🎉🎉非科班转码社区诚邀您入驻🎉🎉
小伙伴们,满怀希望,所向披靡,打码一路向北
一个人的单打独斗不如一群人的砥砺前行
这是和梦想合伙人组建的社区,诚邀各位有志之士的加入!!
社区用户好文均加精(“标兵”文章字数2000+加精,“达人”文章字数1500+加精)
直达: 社区链接点我
本质🤔
动静态库的本质其实就是一个只差颜色的画,它是可执行程序的半成品 \color{red} {动静态库的本质其实就是一个只差颜色的画,它是可执行程序的半成品 } 动静态库的本质其实就是一个只差颜色的画,它是可执行程序的半成品
在之前博客谈预处理的部分就说过,源文件和头文件要最终形成一个 .exe 可执行文件必须经历四步:
- 预处理:头文件展开,去注释,宏替换,条件编译后形成
.i
后缀文件- 编译:词法分析,语法分析,语义分析,符号汇总后形成汇编指令,生成
.s
后缀文件- 汇编:汇编指令转二进制指令,生成
.o
后缀文件- 链接:链接每个
.o
文件最后形成一个.exe
可执行文件
动静态库就是将可执行程序的前身,也就是将 .o 文件抠出来进行封装,然后程序中哪里需要用就直接调用库进行链接即可
关于动静态库🤔
在 Linux 下我们以下面代码为例:
#include <stdio.h>
int main()
{
printf("hello world\n"); //库函数
return 0;
}
结果一定是成功的打印 “hello world”,之所以可以调用 printf 输出,主要原因是 gcc 编译器在生成可执行程序时,将 C 标准库顺利链接进来了
在Linux下,我们可以通过 ldd 文件名
来查看一个可执行程序所依赖的库文件:
我们发现有个库libc.so.6
是带路径的,我们不妨用 ls -l
命令看看他是何方神圣:
哟,这不是软链接吗
实际上该软链接 libc-2.17.so
和 libc.so.6
在同一个目录下,为了进一步了解,我们可以通过 file 文件名
命令来查看 libc-2.17.so 的文件类型:
不难发现两个关键词:共享文件对象,动态链接,这就是我们所说的动态库
在Linux当中,
.so
后缀的是动态库,.a
后缀的是静态库。
在Windows当中,.dll
后缀的是动态库,.lib
后缀的是静态库
libc.so.6
实际上就是动态库,去掉一个动静态库前缀 lib,再去掉后缀 .so 或者 .a 及其后面的版本号,剩下的就是这个库的名字了。而 gcc 编译器默认的是动态链接,若想进行静态链接,需携带 -static 选项
我们再对比一下动态库和静态库,就会发现静态库的大小明显比动态库大了两个量级:
静态链接也会有这样的信息:
特征🤔
静态库😋
静态库在编译链接的时候会直接把库的代码复制到可执行文件当中,生成可执行程序在运行时将不需要静态库,因此使用静态库生成的可执行程序的大小一般比较大
优点: \color{red} {优点:}