在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1、前言 在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找、排序。为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的模块库。通过动态链接库可以实现多个模块之间共享公共的函数。之前看《程序员的自我修养》中讲到程序的链接和装入过程,这些玩意都是底层的,对于理解程序的编译过程有好处。http://www.ibm.com/developerworks/cn/linux/l-dynlink/博文介绍了程序的链接和装入过程。本文重点在于应用,如何编写和使用动态链接库,后续使用动态链接库实现一个插件程序。 2、动态链接库生产 动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。 程序代码如下: 复制代码 代码如下: /*caculate.h*/ #ifndef CACULATE_HEAD_ #endif /*caculate.c文件*/ //求两个数的和 编译生产libcac.so文件如下: gcc -shared -fPIC caculate.c -o libcac.so 复制代码 代码如下: #include <stdio.h> #include "caculate.h" int main() 编译生产可执行文件main如下:gcc main.c -o main -L ./ -lcac (其中-L指明动态链接库的路径,-l后是链接库的名称,省略lib) 3、获取动态链接库的函数 复制代码 代码如下: #include <dlfcn.h> void *dlopen(const char *filename, int flag); char *dlerror(void); void *dlsym(void *handle, const char *symbol); int dlclose(void *handle); Link with -ldl. dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。写个测试程序调用上面生产libcac.so库如下所示: 复制代码 代码如下: #include <stdio.h> #include <dlfcn.h> #define DLL_FILE_NAME "libcac.so" int main() handle = dlopen(DLL_FILE_NAME, RTLD_NOW); func = dlsym(handle, "add"); func = dlsym(handle, "sub"); func = dlsym(handle, "div"); dlclose(handle); 程序执行结果如下所示:gcc call_main.c -o call_main -ldl |
请发表评论