前言
动态库的加载 今天看到dlopen,dlsym的代码不知道在干什么,查阅了相关资料后大概整理了一下
linux接口
dlopen:以指定的模式打开动态库,这个相当于把符号表(函数名)加载到内存中,这样就可以使用动态库中已经有的函数名了; dlsym:第一个参数时dlopen返回的句柄(可以简单的理解为智能指针),第二个参数为要查找的符号(函数名),若存在则返回的是函数地址,否则返回NULL,这样就可以使用函数调用了; dclose:卸载当前加载的共享库; dlerror:无参数,如果前面三个函数返回失败,则为错误消息,否则为NULL;
用途
微软Windows应用的开发者、大型游戏等常利用动态库来更新软件,这样用户只需要更新这个动态库文件就可以
代码解释
#include<math.h>
int add(int a, int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}
int mul(int a, int b)
{
return a*b;
}
int div(int a, int b)
{
return a/b;
}
linux生成动态库的命令:gcc -shared -fpic math.c -o libmath.so
#include<stdio.h>
#include<math.h>
#include<dlfcn.h>
#define MATH_LIB_SO "./libmath.so"
typedef int (*math_pointer)(int, int);
int main()
{
int a=100, b=10;
void * handle;
math_pointer p;
char *op[]={"add", "sub", "mul", "div"};
printf("%d %s %d = %d\n", a, op[0], b, add(a, b));
printf("%d %s %d = %d\n", a, op[1], b, sub(a, b));
printf("%d %s %d = %d\n", a, op[2], b, mul(a, b));
printf("%d %s %d = %d\n", a, op[3], b, div(a, b));
printf("*****************************************\n");
handle = dlopen(MATH_LIB_SO, RTLD_LAZY);
if(handle == NULL)
{
printf("dlopen wrong\n");
return 0;
}
for(int i=0; i<4; i++)
{
p = (math_pointer)dlsym(handle, op[i]);
printf("%d %s %d = %d\n", a, op[i], b, p(a, b));
}
dlclose(handle);
return 0;
}
linux动态链接共享库:gcc -rdynamic main.c math.c -ldl 由于main.c中有普通方式的调用,所以上述命令中需要显示的加上 math.c
#运行结果
100 add 10 = 110
100 sub 10 = 90
100 mul 10 = 1000
100 div 10 = 10
*****************************************
100 add 10 = 110
100 sub 10 = 90
100 mul 10 = 1000
100 div 10 = 10
|