一、什么是库文件
库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在:/lib 和 /usr/lib。
在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储 在/usr/include 下或其子目录下。
库文件分为两种:一种是静态库,命令规则是libxxx.a;一种是共享库,命令规则是libxxx.so。
例如:
libfoo.a libc.so.6 libthread.so
二、库文件的生成与使用
a. 静态库的生成与使用
a.1 静态库的生成:
首先需要生成静态库的“.c”文件用来存放函数的定义,以及一个“.h”头文件用来存放函数声明。
这里有add.c 和max.c,其中add.c定义了两数之和的函数,max.c定义了比较两个数的大小的函数;foo.h中存放着这两个函数的声明。
第一步:先将需要生成库文件的所有“.c“文件编译成“.o”文件。
第二步:使用 ar 命令将第一步编译的所有”.o”文件生成静态库。(静态库的命名必须是libxxx.a)
其中,c是创建库,r是将方法添加到库中,v是显示过程。
这样,一个静态库libfoo.a就创建完成。
a.2 静态库的使用:
首先,创建一个main.c文件
使用静态库libfoo.a和main.c生成可执行程序main并运行
在main.c文件中,这里用到的是#include"foo.h",之所以用到的是#include“foo.h”而不是#include<foo.h>,是因为#include"xxx.h"是在程序当前目录下寻找这个头文件,而#include<xxx.h>是在编译器的类库路径中寻找。
如果想要引用#include<foo.h>,需要做如下操作:
(1)将foo.h头文件移动到编译器的类库路径中(需要管理员权限)
(2)将main.c中#include"foo.h"改成#include<foo.h>
(3)使用静态库libfoo.a和main.c生成可执行程序main并运行
b. 共享库的生成与使用
b.1 共享库的生成
跟静态库的生成一样,首先需要生成静态库的“.c”文件用来存放函数的定义,以及一个“.h”头文件用来存放函数声明。
第一步:先将需要生成库文件的所有“.c“文件编译成“.o”文件。
第二步:使用 gcc命令将第一步编译的所有”.o”文件生成共享库。(共享库命名必须使libxxx.so)
这样一个共享库libfoo.so就创建完成。
b.2 共享库的使用
首先,创建一个main.c文件
使用共享库libfoo.so和main.c生成可执行程序main
将libfoo.so移动到/usr/lib中,运行main程序
ps:为什么静态库不需要移动到/usr/lib中,而共享库需要?
因为编译器在链接的时候,会把静态库中函数的声明以及定义都链接到main文件中,而只能将共享库中的函数声明链接到main中,所以在使用共享库时,需要在类库路径中寻找函数的定义,从而使程序可以运行。