库是什么
本质上来说,库是一种可执行代码的二进制形式,可以被操作系统直接载入内存执行。
Linux下的库
Linux下分为静态库和动态库,这两种库都是可以通过.o文件生成的,也是可以直接使用的。
- 静态库
静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。
链接时间: 静态库的代码是在编译过程中被载入程序中。
链接方式:静态库的链接是将整个函数库的所有数据都整合进了目标代码。这样做优点是在编译后的执行程序不在需要外部的函数库支持,因为所使用的函数都已经被编进去了。缺点是,如果所使用的静态库发生更新改变,你的程序必须重新编译。 - 动态库
动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libmytime.so”
链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数。这样做缺点是因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。优点是动态库的改变并不影响你的程序,所以动态函数库升级比较方便。
它们两个还有很明显的不同点:当同一个程序分别使用静态库,动态库两种方式生成两个可执行文件时,静态链接所生成的文件所占用的内存要远远大于动态链接所生成的文件。(因为静态链接是在编译时将所有的函数都编译进了程序。而动态链接是在运行是才调用库里相应函数)
**应用:
生成一个math静/动态库,可以进行简单的加减乘除运算。**
生成静态库
- 先编写简单的加减乘除函数
- 生成.o文件
- 对一系列.o文件进行打包
- 生成方法:
ar -cr libXXX.a (XXX为库名)
静态库的使用
gcc -o main main.c -static -lXXX -L.
- static :表示程序的静态链接
- lmytime:链接静态库mytime
- L. :链接时需指明静态库所存在的路径,‘.’表示当前路径
这时就生成了可执行文件main
生成动态库
把之前编写的加减程序函数生成.o文件,设置动态库名字为math,生成动态库的文件名就是libmath.so
执行命令:gcc -shared -fPIC -o libXXX.so XXX.c
动态库要使用还要进行链接动态库(root权限下):
mv libmytime.so /usr/lib
生成可执行文件
gcc -o main main.c -lmath -L.
把动态库移到系统库下面后,运行程序,生成可执行文件main
一般静态链接生成的可执行文件大小大于动态库生成的可执行文件。