linux 什么是库文件以及动态库和静态库详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40921797/article/details/82114138

什么是库

在我们写代码的的时候经常会用到很多头文件,其实并不是用那些头文件,而是告诉系统,我写的写个代码需要几个函数,而这几个函数存在一个文件里,我已经把文件名也就是头文件告诉系统了,系统会自动的去一个目录下寻找有没有这个文件。而这个目录就是我们说的库。你可以简单的把它看成一个仓库,因为它会提供给你一些可以直接拿来用的变量、函数或类。
库实际上就是一段编译好的二进制代码,供系统在链接时链接调用。
一般存放在linux的usr/lib目录下。


动态库

程序在运行的时候才去链接动态库的代码,而多个程序共享的使用库中的代码,而我们的系统中,就默认采用的这种方式链接的。
动态库是一个运行时库,需要在程序运行的时候把动态库也加载到内存中,并 这个加载的过程是操作系统操作的,操作系统会在特定的位置寻找该库,所以需要我们将动态库文件存在在指定目录下,才可运行。
* 动态链接 *
在执行文件开始之前外部的函数的机器码由系统从磁盘上对应的该动态库中复制一份到内存中,这个过程就是动态链接。
动态库的生成:

gcc -fPIC -c test.c -o test.o
//这句话的意思就是把test.c文件编译成名为test.o的机器指令
gcc --share test.o -o libtest.so
//将test.o文件打包成动态库“lib”是动态库前缀,“.so”是后缀

静态库

程序在编译链接的时候,会把库中的代码链接复制到可执行文件中。程序在运行的时候将不再需要动态库。
而这种在链接是所做的复制操作,就是静态链接
静态库的生成

gcc -c test.c -o test.o
//将test.c文件编译生成test.o的机器指令
ar -cr libtest.a test.o
//打包将test.o -c创建-r模块替换 生成“lib”为前缀,“.a”为后缀的静态库文件

调用自定义的静态库文件

gcc main.c -L. -ltest
//将main.c在(-L)指定的库路经 "."当前路径下链接(-l)指定库名test(lib 和.a前缀后缀都省略) 。

用静态库链接
在系统中默认是动态链接,那么如果我想要静态链接库文件

gcc --static test.c

linux下的静态库可能没有安装,如果显示失败,需要用户通过yum命令
yum install glibc-static来安装静态库。

对比库文件和可执行文件异同

不同:
1.只要是库文件,文件中就不可以有mian函数。
而可执行文件,必须有且只有一个mian函数。
相同:
1.无论是可执行文件还是库文件都需要编译至少到.o形式的机器代码文件

对比动态库和静态库异同

不同:
1.动态库是运行时系统调用库函数实现链接,代码较小巧,
而静态库是在链接时复制到代码中,代码量较庞大,冗余度高。
2.正因为静态库这种方式也决定了她,在链接后不再依赖静态库存在,及即使静态库被删除程序依然可以正常运行,可移植性强。
而动态库因为是利用本机的库函数,所以可能移植到其他电脑会出现运行bug等问题,可移植性差。
3.他俩的区别在于链接过程的差异,和代码被载入的时刻不同
4.动态库必须放在指定的目录下完成链接,而静态库给出链接文件路径即可
相同:
1.库文件中都不可以出现主mian函数
2.这些库都是提供函数接口,满足功能的,不暴露源代码
3.目的增加代码复用,可共享性,减小冗余

猜你喜欢

转载自blog.csdn.net/weixin_40921797/article/details/82114138