库本质上也是文件,而且库分为两种
1、静态库
libxxxxx.a
2、动态库
libxxxxx.so
这里的库的标准就是前缀libxxxx后缀.a,识别的时候要去掉前缀和后缀,剩下的中间就是库的名字

所以这个库就是c-2.17的库
动态库感性理解
在某某高中的新生小明想要上网,于是问了学长,说是在学校的北门就有小蚂蚁家网吧

小明规划好一天的事,计划中午写完化学作业就去网吧打两小时原神,打完后就回来继续在学校学习, 这里小明就完成了在网吧上网这件事
因为想玩原神
为什么不在宿舍玩原神呢?
因为宿舍没有电脑,只能去网吧玩
回到正题,我们为什么写C语言的时候要调用库呢?
是因为我们没用对应的方法,为什么不自己写一个而是要调用呢,因为我们没有这个能力
当我们规划好我们一天要做的事情后,这个清单就叫做程序,程序里要执行的很多方法就可以自己做, 比如数学作业,化学作业,就像C语言中的for循环,while循环;但是,总有一些需求里的功能我们无法 完成,所以我们就只能跳转到对应的库里面去,而小蚂蚁网吧就相当于动态库。网吧里的机子很多,但是我们只想找一个靠窗能玩原神的机子,就像库里包含的方法很多,我们只要能实现相应功能的方法。 这就叫作调用库函数,2个小时原神打完后我们就该回学校,继续学习计划,就像特定的库函数调用完成 后,程序就继续运行下一个任务。
我们怎么能知道北门这有网吧呢?
是学长告诉的并且我们记住了
这里小明还没有上高中呢,就已经知道了网吧的位置,这个过程我们称之为链接的过程,是谁给小明做 的链接呢?是学长,所以我们就把学长称为链接器,将小明和网吧产生某种关联。
小明把网吧的地址写在了大脑里,程序实际上也是在链接的过程中把相应功能函数的的地址拷贝到可执行程序里,那么这个过程就叫做链接的过程。
这里的小明就相当于一个程序,某某高中就相当于内存,网吧就相当于一个动态库,程序加载到内存当 中,当需要一些功能时就跳转到库里运行,不过库严格意义上来讲也可以加载到内存中去,不过今天暂不考虑。
某一天,有人向学校南门的派出所举报北门的那个黑网吧,之后网吧就被查封了。其实学校里除了小明 还有很大一部分人也去黑网吧,这些人当初也是问的学长,学长给他们建立连接,学校里可能有一大批 的学生就指望着网吧活着,现在黑网吧被取缔了,学校里所有同学就都不能上网了;换言之,这个网吧 就是被所有人共享的
网吧被称为动态库,动态库其实也叫共享库
就像我们的一些指令,使用时都会有链接C语言库的行为

假如我们将系统里C语言的库删掉,这些调用C库都不能运行了
这个就是对动态库的感性认识
静态库的感性理解
三年过去了,小明如愿以偿的考上了大学,让他爸爸给他买一台电脑,他爸爸就去找小蚂蚁网吧的老 板,想买一台网吧里的电脑,小明爸爸就买了一台网吧的电脑,放在了小明的宿舍里。后面小明向上网 了直接就可以在宿舍上网。这里小明爸爸就充当了链接器
他的链接方式非常粗暴,小明想玩原神,他爸爸就直接给他买了一个能玩原神的电脑。就像程序想实现 printf函数的功能,但系统直接所需要将库里所有的代码都拷贝到程序里了
这种方式就叫做静态链接
这样一来,就算学校附近的网吧也被查封了也不会影响到小明玩原神
总结:
1、库分为静态库(专门让编译器,对用户的程序进行静态链接的)和动态库(专门让编译器,对用户的程序进行动态链接的)
2、静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中我所需要的代码到我自己的可执行程序中
3、动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中我所需要的代码到我自己的可执行程序中相关的位置
4、静态库链接成功:我们的程序,不依赖任何库,自己就可以独立运行
5、动态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,我们的程序就无法运行!
6、静态库:因为自身拷贝的问题,比较浪费空间
7、动态库:因为可以做到被大家共享方法,所以真正的实现永远都是在库中,程序内部只有地址,比较节省时间
8、静态库VS动态库:Linux默认使用的是动态链接和动态库!
这里试一下静态链接,但是可以看见静态链接的大小是相当于动态链接的10倍有余

所以才不推荐使用静态链接
一般的云服务器里,都默认只有动态库,我们使用静态链接时可能会报错
这个代码就可以安装C语言静态库
![]()
298



被折叠的 条评论
为什么被折叠?



