一、介绍
程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):
- 静态函数库
静态函数库实际上就是简单的一个普通的目标文件的集合,一般来说习惯用“.a”作为文件的后缀。可以用ar这个程序来产生静态函数库文件。Ar是archiver的缩写。静态函数库现在已经不在像以前用得那么多了,主要是共享函数库与之相比较有很多的优势的原因。慢慢地,大家都喜欢使用共享函数库了。不过,在一些场所静态函数库仍然在使用,一来是保持一些与以前某些程序的兼容,二来它描述起来也比较简单。
静态库函数允许程序员把程序link起来而不用重新编译代码,节省了重新编译代码的时间。不过,在今天这么快速的计算机面前,一般的程序的重新编译也花费不了多少时间,所以这个优势已经不是像它以前那么明显了。静态函数库对开发者来说还是很有用的,例如你想把自己提供的函数给别人使用,但是又想对函数的源代码进行保密,你就可以给别人提供一个静态函数库文件。理论上说,使用ELF格式的静态库函数生成的代码可以比使用共享函数库(或者动态函数库)的程序运行速度上快一些,大概1-5%。
- 动态加载函数库和共享函数库
动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
共享函数库中的函数是在当一个可执行程序在启动的时候被加载。如果一个共享函数库正常安装,所有的程序在重新运行的时候都可以自动加载最新的函数库中的函数。对Linux系统还有更多可以实现的功能:
升级了函数库但是仍然允许程序使用老版本的函数库。
当执行某个特定程序的时候可以覆盖某个特定的库或者库中指定的函数。
可以在库函数被使用的过程中修改这些函数库。
二、创建静态库和动态库
- 静态库的创建
先通过gcc -c创建.o文件,然后通过ra rcs指令创建动态库,生成的.a文件就为静态库
gcc test.c -c
ar rcs libtest.a test.o xxx.o
- 动态库的创建
有两种方式,第一种先生成.o文件,后生成.so文件
gcc test.c -c -fpic
gcc -shared test.o -o libtest.so
第二种是不生成.o文件,直接生成.so文件
gcc -fpic -shared test.c -o libtest.so
其中:-shared 指定生成动态库
-fpic 标注,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
三、库的使用
- 静态库的使用
在对文件编译的时候通过-llibname进行使用,libname是要用的静态库名称,并且通过-L告诉gcc编译器从-L指定的路径去找静态库。默认是从/usr/lib /usr/local/lib去找
gcc test.c -lwiringPi -L /home/pi
- 动态库的使用
一般情况我们可以通过更改配置文件里的内容,来增加动态库寻找路径
https://www.cnblogs.com/progamming/p/13043652.html
本文建议通过脚本和export指令添加环境变量。
新建test.sh脚本
export LD_LIBRARY_PATH="库文件所在的路径"
./test
随后对该脚本增加可执行的权限
chmod +x test.sh
四、静态库和动态库的优缺点以及区别
- 静态库的优缺点
优点:由于静态函数库是在程序执行之前(编译阶段)就加入到程序中了,所以他的运行速度快。
发布程序无需提供静态库,因为已经在app中了,所以移植方便。
缺点:由于是在编译阶段直接加入到可执行文件中的,所以当有多个程序使用该库时,就会有多份重复拷贝。
更新、部署、发布麻烦。
程序大。
- 动态库的优缺点
优点:由于动态库是在程序运行的时候才去调用的,所以程序大小较小
在链接时不复制,多个程序可以共用,所以节省内存。
程序升级简单。
缺点:由于是在程序运行的时候才去调用,所以程序运行速度慢。
发布程序需要提供依赖的动态库。