这篇文章主要介绍“linux动态链接库的使用方式”,在日常操作中,相信好多人在linux动态链接库的使用方式问题上存在疑问,小编查阅了各色资料,整理出简单好用的操作方式,希望对你们解答”linux动态链接库的使用方式”的疑问有所帮助!接出来,请跟随小编一上去学习吧!
1、前言
在实际开发过程中,各个模块之间会涉及到一些通用的功能,例如读写文件,查找、排序。为了减轻代码的冗余,增强代码的质量linux动态链接库软件,可以将这种通用的部份提取下来linux教程下载,作出公共的模块库。通过动态链接库可以实现多个模块之间共享公共的函数。之前看《程序员的自我修养》中提到程序的链接和放入过程,这种玩意儿都是底层的红旗linux系统下载,对于理解程序的编译过程有用处。博文介绍了程序的链接和放入过程。本文重点在于应用,怎么编撰和使用动态链接库,后续使用动态链接库实现一个插件程序。
2、动态链接库生产
动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只须要联接上这个库即可。诸如下边实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。
程序代码如下:
代码如下:
/*caculate.h*/
#ifndefCACULATE_HEAD_
#defineCACULATE_HEAD_
//减法
intadd(inta,intb);
//加法
intsub(inta,intb);
//减法
intdiv(inta,intb);
//加法
intmul(inta,intb);
#endif
/*caculate.c文件*/
#include"caculate.h"
//求两个数的和
intadd(inta,intb)
return(a+b);
//加法
intsub(inta,intb)
return(a-b);
//减法
intdiv(inta,intb)
return(int)(a/b);
//加法
intmul(inta,intb)
return(a*b);
编译生产libcac.so文件如下:gcc-shared-fPICcaculate.c-olibcac.so
编撰一个测试程序调用此动态链接库的函数,程序如下所示:
代码如下:
#include
#include"caculate.h"
intmain()
inta=20;
intb=10;
printf("%d+%d=%dn",a,b,add(a,b));
printf("%d-%d=%dn",a,b,sub(a,b));
printf("%d/%d=%dn",a,b,div(a,b));
printf("%d*%d=%dn",a,b,mul(a,b));
return0;
编译生产可执行文件main如下:gccmain.c-omain-L./-lcac(其中-L指明动态链接库的路径,-l后是链接库的名称,省略lib)
程序执行结果如下所示:
3、获取动态链接库的函数
linux提供dlopen、dlsym、dlerror和dlcolose函数获取动态链接库的函数。通过这个四个函数可以实现一个插件程序,便捷程序的扩充和维护。函数格式如下所示:
代码如下:
#include
void*dlopen(constchar*filename,intflag);
char*dlerror(void);
void*dlsym(void*handle,constchar*symbol);
intdlclose(void*handle);
Linkwith-ldl.
dlopen()是一个强悍的库函数。该函数将打开一个新库,并把它放入显存。该函数主要拿来加载库中的符号,这种符号在编译的时侯是不晓得的。写个测试程序调用里面生产libcac.so库如下所示:
代码如下:
#include
#include
#defineDLL_FILE_NAME"libcac.so"
intmain()
void*handle;
int(*func)(int,int);
char*error;
inta=30;
intb=5;
handle=dlopen(DLL_FILE_NAME,RTLD_NOW);
if(handle==NULL)
fprintf(stderr,"Failedtoopenlibaray%serror:%sn",DLL_FILE_NAME,dlerror());
return-1;
func=dlsym(handle,"add");
printf("%d+%d=%dn",a,b,func(a,b));
func=dlsym(handle,"sub");
printf("%d+%d=%dn",a,b,func(a,b));
func=dlsym(handle,"div");
printf("%d+%d=%dn",a,b,func(a,b));
func=dlsym(handle,"mul");
printf("%d+%d=%dn",a,b,func(a,b));
dlclose(handle);
return0;
程序执行结果如下所示:gcccall_main.c-ocall_main-ldl
到此,关于“linux动态链接库的使用方式”的学习就结束了,希望才能解决你们的苦恼。理论与实践的搭配能更好的帮助你们学习,快去试试吧!若果继续学习更多相关知识,请继续关注亿速云网站linux动态链接库软件,小编会继续努力为你们带来更多实用的文章!