库是一种软件组件技术,库里面封装了数据和函数。
Linux库文件通常存放在/usr/lib或/lib目录下。
Linux静态库文件名组成: 前缀lib、库名和后缀.a组成(‘lib*.a’)。
静态库的代码在编译时就拷贝的应用程序中,这样的优点是节省编译时间,当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。
静态库是obj文件的一个集合,通常静态库以“.a”为后缀,它的优点是可以在不用重新编译程序库代码的情况下,进行程序的重新链接,这种方法节省了编译过程的时间(在编译大型程序的时候,需要花费很长的时间)。但是由于现在系统的强大,编译的时间已经不是问题。静态库的另一个优势是开发者可以提供库文件给使用的人员,不用开放源代码,这是库函数提供者经常采用的手段。当然这也是程序模块化开发的一种手段,使每个软件开发人员的精力集中在自己的部分。在理论上,静态库的执行速度比共享库和动态库要快(1%~5%)。
//filename:fun.c
#include <stdio.h>
void fun(void) {
printf("XiyouLinuxGroup\n");
}
//filename:main.c
#include <stdio.h>
//声明函数,可以把所有的声明放到一个"*.h"文件中,然后主函数包含它就可以
void fun(void);
int main(void) {
printf("hello universe\n");
fun();
return 0;
}
1.编译生成目标文件
gcc -c fun.c
//生成fun.o文件
2.用ar归档目标文件,生成静态库
//库文件名格式必须为lib*.a
ar rcsv libfun.a fun.o
//生成libfun.a,可以将此文件拷到/usr/lib或/lib目录下
3.使用静态库时记得链接自己的库
gcc main.c -static -L. -lfun -o main
//生成可执行文件main
//如果不加-o main,会生成a.out文件
gcc -o main main.c libfun.a
//效果和上面相同
gcc main.c -static -L. -lfun
//会生成a.out文件
Note:
-static : 当有动态库和静态库重名时,强制链接静态库
库的文件名必须形如 lib*.a ,这样我们在链接这个库时,就可以用 -l*。
编译器就会在指定的目录中搜索 lib*.a 。
上面的命令中 -L. 告诉 gcc 搜索链接库时包含当前路径, -l* 告诉 gcc 生成可执行程序时要链接 lib*.a
常用选项:
c 创建一个库,如果需要生成新的库文件,不要警告
v 输出详细信息
d:从库中删除成员文件。
r:在库中加入成员文件,若存在,则替换。
s:无论ar命令是否修改了库内容,都强制重新生成库符号表。
4.运行程序