- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态加载动态库说明及实例
linux 动态加载 动态链接库
显式调用的含义是代码出现库文件名,用户需要自己去打开和管理库文件。其要点为:
把dlfcn.h系统头文件包含进来
用dlopen函数打开库文件,并指定打开方式
dllope的的第一个参数为共享库的名称,将会在下面位置查找指定的共享库。
???环境变量LD_LIBRARY_PATH列出的用分号间隔的所有目录。
???文件/etc/ld.so.cache中找到的库的列表,由ldconfig命令刷新。
???目录usr/lib。
???目录/lib。
???当前目录。
第二个参数为打开共享库的方式。有两个取值
???RTLD_NOW:将共享库中的所有函数加载到内存
???RTLD_LAZY:会推后共享库中的函数的加载操作,直到调用dlsym()时方加载某函数
用dlerror()函数测试是否打开成功,并进行错误处理;
用dlsym获得函数地址,存放在一个函数指针中
用获得的函数指针进行函数调用。
程序结束时用dlclose关闭打开的动态库,防止资源泄露。
用ldconfig工具把动态库的路径加到系统库列表中
1、编写测试文件
//main.c 测试动态库显式调用的程序
#includedlfcn.h??????//用于动态库管理的系统头文件??
#include myalib.h????//要把函数的头文件包含进来,否则编译时会报错
int main(int argc,char* argv[])
{
???//声明对应的函数的函数指针
???void (*pTest)();????????
???//加载动态库
???void *pdlHandle = dlopen(libtest.so, RTLD_LAZY);
???//错误处理
????????if(pdlHandle == NULL )????{
????????printf(Failed load library/n);
????????return -1;
????}
????char* pszErr = dlerror();
????if(pszErr != NULL)
????{
????????printf(%s/n, pszErr);
????????return -1;
????}
????//获取函数的地址
????pTest = dlsym(pdlHandle, test);
????pszErr = dlerror();
????if(pszErr != NULL)
????{
????????printf(%s/n, pszErr);
????????dlclose(pdlHandle);
????????return -1;
????}
????//实现函数调用
????(*pTest)();
???//程序结束时关闭动态库
???dlclose(pdlHandle);
???return 0;??
}
2、编译测试文件 使用-ldl选项指明生成的对象模块需要使用共享库
gcc -o main -ldl main.c
执行完后就生成了一个main文件
3、执行测试程序
执行 ./main
输出
????test
????说明成功。
----------------------------------分割------------------------------------------
//say.c
?#include?stdio.hint?say(char?**str){????????printf(%s/n,str);}
将say.c 生成共享库的编译:gcc -o dlopen.so -shared say.c
//使用dlopen函数动态加载库的源代码
#include?stdio.h#include?dlfcn.h#include?unistd.hvoid?show_help(char?*msg){????????if(msg?==?NULL){????????????????printf(Usage:mydlopen dlopen.so say stringtosay/n);????????}else{????????????????printf(%s/n,msg);????????}????????exit(1);}int?main(int?ac,char?**?av){????????if(ac??3){????????????????show_help(NULL);????????}????????void?*handle;????????//void *pfunc;????????int?(*pfunc)(char?*str);???????
文档评论(0)