在程序运行的基础原理这篇文章中,最后的代码进行链接过程,我们提到了动态库和静态库的概念。那么什么是动态库和静态库呢?我们来简单理解一下
静态库和动态库
- 1.静态库
- 1.1 静态链接优点
- 1.2 静态链接缺点
- 2.动态库
- 2.1 动态链接的优点
- 2.2 动态链接缺点
- 3.Linux默认是动态链接
- 3.1 用ldd指令验证
- 3.2 用file指令验证
- 4.验证动态库和静态库占用空间差异
- 5.总结
1.静态库
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中(这种链接方式也叫静态链接),因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
1.1 静态链接优点
静态链接成功,我们的程序可以不依赖任何库了,可以独立运行。
1.2 静态链接缺点
因为静态链接是把库中的代码全部拷贝到可执行文件中,所以比较浪费空间。
2.动态库
与静态库相反,动态库编译链接时,并没有把库文件中的代码加入到可执行文件中,而是在程序运行时链接文件加载库(拷贝动态库我所需要的代码的地址,通过这个地址就可以从动态库找到我所需要的内容),这样可以节省空间。其后缀名一般为(.so)
2.1 动态链接的优点
动态链接是可以做到被多个程序共享的,程序的内部只有地址,所以比较节省空间。
2.2 动态链接缺点
一旦我们的程序和动态库产生动态链接,那么我们的程序就依赖动态库,如果没有动态库我们的程序将无法正常运行。
3.Linux默认是动态链接
3.1 用ldd指令验证
ldd是list dynamic dependencies的缩写, 意思是, 列出动态库依赖关系。
对一个C语言可执行程序使用ldd指令
动态库的名字一般是 libxxx.so,后缀so表示我们的动态库,xxx是名称
可以看到,去掉前缀和后缀,这是一个c语言的库,而且是动态库。
3.2 用file指令验证
file指令可以辨识文件的类型
4.验证动态库和静态库占用空间差异
静态链接占的空间较大,动态库占的空间较小。
由于Linux是默认动态链接的,所以我们要验证静态链接的话,要强行转为静态链接的方式
在用-static时,可能会报错:
/usr/bin/ld: cannot find -lc错误
执行这行命令安装即可,sudo yum install glibc-static
顺便也可以用ldd指令和file指令看静态链接的可执行文件
不是动态的可执行程序
5.总结
链接有动态链接和静态链接,各有各自的优缺点。
Linux下默认为动态链接。
ldd指令和file指令可以查看一个可执行文件是动态链接还是静态链接