2;
3 #include "time.h"
4 #include "datetime.h"
5;
6 int gettime(TIMETYPE *t)
7 {
8 long ti;
9 struct tm *tm;
10
11 time(&ti);
12 tm=localtime(&ti);
13 t->hour=tm->tm_hour;
14 t->min=tm->tm_min;
15 t->sec=tm->tm_sec;
16 }
17;
----------------------------------------------------------------------;
gettime函数与getdate函数相仿,先用time函数取得以秒计的系统时间,再用localtime函数转换一下时间结构,最后返回当前的时间(不需调整) 。
1.4 编写维护文件makefile-lib,内容如下:
----------------------------------------------------------------------;
1 # makefile-lib : 纵横软件制作中心雨亦奇编写, 2001-06-28.
2;
3 all : my.so
4;
5 SRC = https://www.rkxy.com.cn/dnjc/getdate.c gettime.c
6;
7 TGT = $(SRC:.c=.o)
8;
9 $(SRC) : datetime.h
10 @touch $@
11;
12 %.o : %.c
13 cc -c $?
14;
15 # 动态函数库(my.so)生成
16 my.so : $(TGT)
17 cc -shared -o $@ $(TGT)
18;
----------------------------------------------------------------------;
编写维护文件的目的,在于方便程序员维护程序,尤其是维护比较大的工程项目 。一个素质良好的程序员应该学会熟练地编写维护文件makefile 。定义了文件间的依赖关系后,一旦源文件发生变化,仅需make一下,其目标文件维护代码会自动执行,从而自动更新目标文件,减少了许多工作量 。注意: 每行维护代码必须以TAB(跳格键)开始,不是的话make时将出错 。
本维护文件第1行是注释行,以#号开头;文件第3行定义所有需要维护的函数库;第5行定义相关源程序文件;第7行定义目标文件;第9-10行说明所有源程序依赖于datetime.h头文件,并有相应维护代码,即touch一下,更新一下源文件的时间;第12-13行定义.o文件依赖于相应的.c文件,并指定了维护代码,即用cc编译一下;第16-17行定义共享库my.so依赖的目标文件,维护代码中用-shared编译选项,以生成动态链接库 my.so 。
1.5 运行make -f makefile-lib 命令
make运行后,动态链接库my.so就产生了,我们就可以在程序中调用了 。如果想让系统所有用户都可以使用,则应以root用户登录系统,将这个库拷贝到/lib目录下(命令:cp my.so /lib),或者在/lib目录下建个符号连接即可(命令:ln -s `pwd`/my.so /lib) 。
2、LINUX下动态链接库的使用
2.1 重要的dlfcn.h头文件
LINUX下使用动态链接库,源程序需要包含dlfcn.h头文件,此文件定义了调用动态链接库的函数的原型 。下面详细说明一下这些函数 。
2.1.1 dlerror
原型为: const char *dlerror(void);
当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功 。
2.1.2 dlopen
原型为: void *dlopen (const char *filename, int flag);
dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄 。
filename: 如果名字不以/开头,则非绝对路径名,将按下列先后顺序查找该文件 。
(1) 用户环境变量中的LD_LIBRARY值;
(2) 动态链接缓冲文件/etc/ld.so.cache
(3) 目录/lib,/usr/lib
flag表示在什么时候解决未定义的符号(调用) 。取值有两个:
1) RTLD_LAZY : 表明在动态链接库的函数代码执行时解决 。
2) RTLD_NOW : 表明在dlopen返回前就解决所有未定义的符号,一旦未解决,dlopen将返回错误 。
dlopen调用失败时,将返回NULL值,否则返回的是操作句柄 。
2.1.3 dlsym : 取函数执行地址
原型为: void *dlsym(void *handle, char *symbol);
dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址 。由此地址,可以带参数执行相应的函数 。
如程序代码: void (*add)(int x,int y); /* 说明一下要调用的动态函数add */
推荐阅读
- 夏日肉鸭中暑的防治方法
- 中国之都有哪些 中国各大城市叫什么都
- iTunes更新手机系统详细操作方法
- 详解Linux 2.6内核新文件系统变化机制
- 夏季牲畜灌服凉性中草药好
- WPS2019中为文字添加阴影具体操作步骤
- 在linux7.1上安装jdk+tomcat+oracle9i 笔记
- 公积金支付宝怎么提取
- 羊中暑症状及治疗
- ios12中关闭应用通知的操作步骤
