一、静态链接库
静态库由ar工具创建。编译应用程序和静态库链接时,链接器将静态库中被调用的对象嵌入至可执行映像文件中,这样在没有静态库的环境下,应用程序也能独立运行。静态库文件的命名规则是libxxx.a,以lib开头,.a作为文件名后缀
1、静态库管理工具ar
ar [option] file.a objects
-c 创建一个函数库
-d 从函数库中删除目标文件
-t 显示函数库中目标对象列表
-r 向函数库中插入目标对象,若存在则替换
-u 若函数库中已经存在同名目标,则用新目标更新
-x 从函数库中提取一个目标对象
-v 显示ar的版本信息
如,有test1.c,test2.c两个文件,要创建静态库文件libtest.a
gcc -Wall -c test1.c test2.c
ar -cru libtest.a test1.o test2.o
2、使用静态库
使用静态库需要定义静态库的应用接口
//func.h
#ifndef _FUNC_API_H
#define _FUNC_API_H
//function1和function2分别是test1.c和test2.c中的函数
extern int function1();
extern int function2();
#endif
假如有main.c文件使用libtest.a静态库
gcc -o test main.c -L. -ltest
二、动态链接库
经过编译后应用程序在和动态库链接时,链接器在库中检查所需的符号信息(如,函数和变量),只在生成可执行文件中记录这些信息的来源。应用程序运行中调用时,才把目标对象加载入内存中。因此当动态库不存在时,程序无法运行。动态链接库的命名规则是libxxx.so
1、创建动态库
gcc -fPIC -c test1.c #生成目标文件test1.o
gcc -fPIC -c test2.c
gcc -shared test1.o test2.o -o test.so
-fPIC 选项是告诉gcc创建地址独立了目标文件,选项-shared告诉gcc创建一个共享库
2、使用动态库
使用动态库不需要自己编写应用接口,Linux环境下提供了一组API
#include <dlfcn.h>
void *dlopen(const char *filename,int flag); //打开动态链接库,打开成功返回链接库“句柄”
const char *dlerror(void); //检查动态库操作是否失败,成功返回NULL
void *dlsym(void *handle,char *symbol); //取函数执行地址
int dlcolse(void *handle); //关闭动态链接库
有了这组API就可以使用动态库了
编译链接
gcc -rdynamic -o test main.c -ldl
在运行的时候可能会出现找不到动态库的情况,就算链接库就在可执行程序目录下。这里有两种解决方案