程序中动态加载共享库

Posted qiuyuwutong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序中动态加载共享库相关的知识,希望对你有一定的参考价值。

前提:本文是基于Linux系统下的编程与学习

动态加载,按需加载,工程师需要动态库的时候,才将动态库加载到内存。

dlopen(3)
#include <dlfcn.h>
void *dlopen(const char *filename, int flags);
功能:打开一个共享库文件,返回一个handle。指向了打开的共享库对象
filename:"字符串" 指定了共享库的文件名字
flags:
RTLD_LAZY:懒加载 只适用于函数。只有在函数被执行的时候,才确定函数的地址。函数不执行,不加载。

RTLD_NOW:立即加载 在dlopen返回之前,动态库的符号就已经确定了地址

返回值:
NULL 代表函数执行失败

 

dlcose(3)

int dlclose(void *handle);
功能:关闭共享库,共享库的引用计数减一,如果引用计数为0.系统卸载该共享库。
handle:共享库加载到内存的地址
返回值:
成功 0
错误 非0的错误值

 

dlerror(3)
#include <dlfcn.h>
char *dlerror(void);
功能:获取dlopen API函数调用产生的错误信息
参数:void
描述错误信息的字符串

 

dlsym(3)

#include <dlfcn.h>
void *dlsym(void *handle, const char *symbol);
功能:获取共享库中symbol的地址
handle:指定共享库
symbol:指定要找的符号的名字 函数 全局变量 静态局部变量
返回值:
成功 返回symbol加载到内存的地址
失败 NULL 可以使用dlerror(3)获取错误的原因

 

参考代码:

 1 //动态加载
 2 #include <stdio.h>
 3 #include <dlfcn.h>
 4 
 5 typedef int (*fun)(int ,int);
 6 
 7 int main(){
 8     //打开共享库文件
 9     void* handle=dlopen("libtmath.so",RTLD_NOW);
10     if(handle==NULL){
11         printf("%s
",dlerror());
12         return -1;
13     }
14     //获取需要的函数的入口地址
15     void* p=dlsym(handle,"add");
16     if(p==NULL){
17         printf("%s
",dlerror());
18         return -1;
19     }
20     fun func;
21     func=(fun)p;
22     printf("%d
",func(3,5));
23     //关闭共享库
24     dlclose(handle);
25     return 0;
26 }

 

























以上是关于程序中动态加载共享库的主要内容,如果未能解决你的问题,请参考以下文章

静态库和共享库

linux 函数库使用

linux链接相关

Linux动态库生成与使用指南

动态链接及静态链接

Linux中的动态库(共享库)的制作