一、静态库
1、创建库源文件liberr.c
2、编译:gcc -c liberr.c -o liberr.o
3、创建存档文件:ar rcs liberr.a liberr.o
4、创建使用库的源文件errtest.c
5、编译连接:gcc errtest.c -o errtest -static -L. -lerr
二、动态库
1、创建库源文件liberr.c
2、编译:gcc -fPIC -g -c liberr.c -o liberr.o
3、连接库:gcc -g -shared -Wl,-soname,liberr.so -o liberr.so.1.0.0 liberr.o -lc
4、创建符号链接:ln -s liberr.so.1.0.0 liberr.so.1
ln -s liberr.so.1.0.0 liberr.so
5、创建使用库的源文件errtest.c
6、编译连接:gcc -g errtest.c -o errtest -L. -lerr
7、运行:LD_LIBRARY_PATH=$(pwd) ./errtest
三、动态加载共享对象
四个函数:
1、加载共享对象void *dlopen(const char *filename,int flag);
2、使用共享对象void *dlsym(void *handle, char *symbol);
3、检查错误 const char *dlerror(void);
4、卸载共享对象int dlclose(void *handle);
例:
1 /*
2 * dltest.c
3 * Dynamically load liberr.so and call err_ret()
4 * Listing 24.4
5 */
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <dlfcn.h>
9
10 int main(void)
11 {
12 void *handle;
13 void (*errfcn)();
14 const char *errmsg;
15 FILE *pf;
16
17 handle = dlopen(“liberr.so”, RTLD_NOW);
18 if(handle == NULL) {
19 fprintf(stderr, “Failed to load liberr.so: %s/n”, dlerror());
20 exit(EXIT_FAILURE);
21 }
22
23 dlerror();
24 errfcn = dlsym(handle, “err_ret”);
25 if((errmsg = dlerror()) != NULL) {
26 fprintf(stderr, “Didn’t find err_ret(): %s/n”, errmsg);
27 exit(EXIT_FAILURE);
28 }
29 if((pf = fopen(“foobar”, “r”)) == NULL)
30 errfcn(“couldn’t open foobar”);
31
32 dlclose(handle);
33 return EXIT_SUCCESS;
34 }
编译:gcc -g -Wall dltest.c -o dltest -ldl
运行:LD_LIBRARY_PATH=$(pwd) ./dltest
参考文献:GNU/LINUX 编程指南(第二版)