exit(1);
40 }
41
42 getdate(&d); /* 调用此共享函数 */
43 printf("当前日期: %04d-%02d-%02d\n",d.year,d.mon控制工程网版权所有,d.day);
44
45 gettime=dlsym(dp,"gettime"); /* 定位取时间函数 */
46
47 error=dlerror(); /* 检测错误 */
48 if (error) /* 若出错则退出 */
49 {
50 fputs(error,stderr);
51 exit(1);
52 }
53
54 gettime(&t); /* 调用此共享函数 */
55 printf("当前时间: %02d:%02d:%02d\n",t.hour,t.min,t.sec);
56
57 dlclose(dp); /* 关闭共享库 */
58
59 exit(0); /* 成功返回 */
60
61 }
----------------------------------------------------------------------
程序说明:
第8行: 包含标准输入输出头文件,因为程序中使用了printf,puts,fputs等标准输入输出函数,需要让编译器根据头文件中函数的原型,检查一下语法;
第10-11行: 包含动态链接库功能头文件CONTROL ENGINEERING China版权所有,并定义动态链接库名称;
第13-14行: 定义宏SHARED以便引用14行的头文件datetime.h中的动态函数说明;
第25行: 用dlopen打开SOFILE共享库,返回句柄dp;
第27-31行: 检测dp是否为空,为空则显示错误后退出;
第33行: 用dlsym取得getdate函数动态地址;
第35-40行: 如果dlerror返回值不为空CONTROL ENGINEERING China版权所有,则dlsym执行出错,程序显示错误后退出;
第42-43行: 执行getdate调用,输出当前日期;
第45行: 用dlsym取得gettime函数动态地址;
第47-52行: 如果dlerror返回值不为空CONTROL ENGINEERING China版权所有,则dlsym执行出错,程序显示错误后退出;
第54-55行: 执行gettime调用,输出当前时间;
第57行: 用dlclose关闭dp所指示的动态链接库;
第59行: 程序退出,返回0值。
2.2.2 编写维护文件
维护文件makefile内容如下:
----------------------------------------------------------------------
1 # makefile : 纵横软件制作中心雨亦奇编写, 2001-06-28.
2
3 all : dy
4
5 DYSRC = dy.c
6
7 DYTGT = $(DYSRC:.c=.o)
8
9 %.o : %.c
10 cc -c $?
11
12 # 动态库应用示范程序
13 dy : $(DYTGT)
14 cc -rdynamic -s -o $@ $(DYTGT) -ldl
15
----------------------------------------------------------------------
维护文件说明:
第3行: 定义所有需要维护的模块;
第5行: 定义源程序;
第7行: 定义目标文件;
第9-10行: 定义.o文件依赖于.c文件,维护代码为“cc -c 变动的源文件名”;
第13-14行: 定义dy依赖于变量DYTGT指示的值,维护代码中采用-rdynamic选项以指定输出文件为动态链接的方式,选项-s指定删除目标文件中的符号表,最后的选项-ldl则指示装配程序ld需要装载dl函数库。
2.2.3 运行make命令
运行make后将产生执行文件dy,运行后将产生如下类似信息:
动态链接库应用示范
当前日期: 2001-06-28
当前时间: 10:06:21
当删除my.so文件时CONTROL ENGINEERING China版权所有,将出现以下信息:
动态链接库应用示范
my.so: cannot open shared object file: 文件或目录不存在
3、小结
Linux创建与使用动态链接库并不是一件难事。
编译函数源程序时选用-shared选项即可创建动态链接库,注意应以.so后缀命名,最好放到公用库目录(如/lib,/usr/lib等)下面,并要写好用户接口文件,以便其它用户共享。
使用动态链接库www.cechina.cn,源程序中要包含dlfcn.h头文件,写程序时注意dl