一、简介
实际开发工程中,一般会有很多函数只是声明,而找不到实现的代码,因为那些实现代码已经编译成库了。在Linux系统中.o、.a、*.so文件都是Linux下的程序函数库,即编译好的可供其他程序使用的代码和数据,一般来讲:
==.o==:是目标文件,相当于windows中的.obj文件(动态加载函数库);
==.so==:为共享库,是shared object,用于动态链接的,和dill差不多(共享函数库);
==.a==:为静态库,是好多个.o合在一起,用于静态链接(静态函数库);
==.la==:为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息;
这样做有以下优点:程序模块化,容易重新编译,方便升级。
库文件在链接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路劲是系统中进行设置的,一般Linux把/lib和/usr/lib两个目录作为默认的库搜索路径,所以使用这两个目录中的库时,不需要进行设置搜索路径即可直接使用。
假设当前目录下有这些源文件:main.c func.c func.h,其中main.c要调用func.c中的函数。以下分别是Linux下将func.c生成静态库和动态库的方法,以及如何使用生成的静态库和动态库。
二、静态链接库
2.1 静态库的特点
静态链接库可以将代码进行封装,具有如下特点:
静态函数库实际上是简单的普通目标文件(*.o)的集合;
静态函数库在可执行程序链接时就加入到可执行代码中,在物理上成为可执行程序的一部分;
静态函数库链接生成的程序,在哪里都可以运行,无需该静态函数库的支持;
相对于动态函数库链接生成的程序,静态函数库链接生成的可执行程序文件较大;
2.2 静态库的优点
相比源代码来说,静态链接库有如下特点:
可以重用以前的程序模块;
开发者可以对源代码保密;
允许程序员不用重新编译代码而直接把程序link起来,节省了重新编译代码的时间(该优势目前已不明显);
理论上将,使用elf格式的静态库函数生成的代码可以比使用共享函数库生成的程序运行速度快。
2.3 静态库的制作
【命令格式】:
在linux环境中,使用ar命令创建静态库文件(创建嵌入式静态库,可使用arm-linux-ar命令),该命令格式如下:
ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files…
arm-linux-ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files…
==archive==:定义库的名称;
==files==