一.动静态库的初步理解
1.库的作用
书接上次我们提到的程序的翻译过程中的链接阶段
以C语言代码为例
在链接阶段,我们的.c源文件经过预处理,编译,汇编之后形成了.o目标文件
我们的这个.o文件如果想要形成可执行程序
就一定会用到我们的C库
比如说以最简单的C语言代码为例:
#include <stdio.h> int main() { printf("hello world"); return 0; }
在这里这个printf函数就不是我们实现的,而是使用的C语言官方库里面的stdio.h头文件中所声明出来的printf这个函数
所以在程序的翻译阶段我们就要将我们的.o目标文件和库中的.o目标文件关联起来
也就是说gcc是知道我们是肯定要用到C库的,而且gcc也知道C库在什么地方
所以gcc说:不用你给我指定了,反正我是知道你要用C库,而且C库在哪我一清二楚
下面我们来验证一下;
说明一下:
ldd命令可以查看一个可执行程序所依赖的库文件
我们在看这个libc.so.6的库之前要先补充一个内容
就是Linux中的库的后缀名
2.Linux和Windows中库的后缀名
3.如何在Linux中看一个的库名字
在Linux中,无论是动态库还是静态库
都是以lib开头的
而且.so以及之后的内容都可以去掉不看
所以这个库就从
libc.so.6 被我们简化成了 c
也就是c标准库
因此我们就证明了C语言代码会跟C库关联起来
那么如果我现在生气了,main函数里面我只写一个return 0;
我看看它还跟不跟C库关联
答案是:还是跟C库关联
因此只要你是一个C语言代码,你命中注定就要跟我C库关联
4.Linux中和Windows平台怎样支持开发的?
这是Linux为我们提供的C语言的头文件
这是Linux为我们提供的C语言的库文件
所以我们就能更好地理解这句话了
其实库文件是二进制文件,也就是.o文件
因此库文件才能跟我们的.o目标文件进行链接
5.动静态库的概念
我们跟动态库形成的链接叫做动态链接
跟静态库形成的链接叫做静态链接
因此,如果我今天在Linux中把我们C语言的C标准库给干掉
那么ls,pwd,whoami,who,su等等几乎所有用C语言写的指令都无法运行了
6.动静态库的优缺点与补充
7.代码验证
gcc -o mycmd1 test.c 使用动态链接进行编译(动态链接是gcc的默认行为) gcc -o mycmd2 test.c -static 使用静态链接进行编译(需要在gcc命令后面加上-static选项)
下面我们来演示一下:
我们就以这个代码为例,分别用动态链接和静态链接去编译,来对比一下所分别形成的可执行程序的大小
1.动态链接进行编译
动态链接生成的可执行程序的大小:8360
2.静态链接进行编译
可是报错了,为什么呢?因为我们在前面说过,我们的云服务或者是虚拟机默认是没有给我们安装C语言的静态库的,那么我们现在自己来安装
Centos 7中使用yum安装
C语言静态库:glibc-static C++静态库:libstdc++-static
执行:
sudo yum install -y glibc-static libstdc++-static
然后我们回过头来继续使用静态链接进行编译
关于动静态库的知识我们以后还会再进行介绍的,目前就先介绍到这里