首页 未命名正文

linux编程_C语言之静态链接库和动态链接库

云返利网 未命名 2020-05-26 09:06:27 7 0

1:静态链接库

对照早泛起的是静态链接库。静态库实在就是商业公司将自己的函数库源代码经由只编译不毗邻形成.o的目的文件,然后用ar工具将.o文件归档成.a的归档文件(.a的归档文件又叫静态链接库文件)。商业公司通过公布.a库文件和.h头文件来提供静态库给客户使用;客户拿到.a和.h文件后,通过.h头文件得知库中的库函数的原型,然后在自己的.c文件中直接挪用这些库文件,在毗邻的时刻链接器会去.a文件中拿出被挪用的谁人函数的编译后的.o二进制代码段链接进去形成最终的可执行程序。

2:动态链接库

动态链接库比静态链接库泛起的晚一些,效率更高一些,是改进型的。现在我们一样平常都是使用动态库。静态库在用户链接自己的可执行程序时就已经把挪用的库中的函数的代码段链接进最终可执行程序中了,这样利益是可以执行,坏处是太占地方了。尤其是有多个应用程序都使用了这个库函数时,实际上在多个应用程序最后天生的可执行程序中都各自有一份这个库函数的代码段。当这些应用程序同时在内存中运行时,实际上在内存中有多个这个库函数的代码段,这完全重复了。而动态链接库自己不将库函数的代码段链接入可执行程序,只是做个符号。然后当应用程序在内存中执行时,运行时环境发现它挪用了一个动态库中的库函数时,会去加载这个动态库到内存中,然后以后不管有多少个应用程序去挪用这个库中的函数都市跳转到第一次加载的地方去执行(不会重复加载)

3:静态链接库和动态链接库的对照

静态库是用户在链接字节的可执行程序时已经将挪用到的库函数的代码段链接到最终的可执行程序中,这样的利益是这样的可执行文件放到任何地方都能执行,坏处是库函数很占地方,使得链接获得的最终的可执行程序变得很大。

使用动态库的时刻,函数自己编译链接到获得可执行程序的时刻,并不会讲库函数链接到可执行程序中去,而是符号这个函数用到哪些库函数,当这个可执行程序运行时,操作系统会自动加载这些库到内存中。

对照:

通过上面的剖析可以知道,静态库是将库函数链接到最终的可执行程序中,而动态库是没有将库函数链接到可执行程序中。从单个可执行程序的角度出发可执行程序在内存中运行时,系统照样会将库函数加载到内存中,这样从内存角度上讲,两个可执行程序最终在内存中运行时所占的空间照样一样的。然则从多个程序出发,就不一样了,好比a程序和b程序都用到了printf函数,使用静态库时,这两个可执行程序都包含了printf函数,以是这时刻内存中就包含了两份printf函数;而使用动态库的时刻,系统只会加载一份printf函数,当其他函数也要用到printf函数时,只要到加载的printf函数的地址中挪用即可,不需要再次加载,以是当多个程序运行时,静态库就显著比动态库更占内存。

4:函数库中库函数的使用

(1)gcc中编译链接程序默认是使用动态库的,要想静态链接需要显式用-static来强制静态链接。

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)