动态链接库,可以方便程序体扩展功能、更新组件,相对于编译时连接,具有更大的灵活性,下面我们从三个方面来讲解一个案例。
库函数定义
在这里,我们首先定义一个简单的加法函数。
1#include <stdio.h>
2
3int add(int a,int b){
4 return a+b;
5}
动态链接库编译
我们通过编译命令对于源码文件进行编译,在linux系统中编译为so文件。
1gcc -shared -fPIC ./io.c -o add.so
编译参数解析
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接,相当于一个可执行文件。
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
测试动态链接库是否可用
编写测试代码
1#include <stdio.h>
2#include <dlfcn.h>
3
4int main() {
5 void *handle = dlopen("./add.so", RTLD_LAZY); //打开动态链接库文件
6 char *dlerr = dlerror(); //跟踪动态链接库错误
7
8 if (handle == NULL || dlerr != NULL) {
9 printf("%s\n", dlerr);
10 return -1;
11 }
12
13 int (*add)(int, int) = dlsym(handle, "add"); //加载动态链接库函数 转换为函数指针
14 printf("%d\n", add(1, 2)); //根据函数指针调用动态链接库函数
15 return 0;
16}
编译测试代码时,需要链接dl库 ,编译命令如下:
1gcc test.c -o test -ldl
如果时MakeFIle 也需要添加此选项。
最终就能成功调用动态链接库中的add函数。