知识大全 LINUX系统中动态链接库的创建与使用
Posted 函数
篇首语:要须心地收汗马,孔孟行世目杲杲。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 LINUX系统中动态链接库的创建与使用相关的知识,希望对你有一定的参考价值。
LINUX系统中动态链接库的创建与使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
大家都知道 在WINDOWS系统中有很多的动态链接库(以 DLL为后缀的文件 DLL即Dynamic Link Library) 这种动态链接库 和静态函数库不同 它里面的函数并不是执行程序本身的一部分 而是根据执行程序需要按需装入 同时其执行代码可在多个执行程序间共享 节省了空间 提高了效率 具备很高的灵活性 得到越来越多程序员和用户的青睐 那么 在LINUX系统中有无这样的函数库呢? 答案是肯定的 LINUX的动态链接库不仅有 而且为数不少 在/lib目录下 就有许多以 so作后缀的文件 这就是LINUX系统应用的动态链接库 只不过与WINDOWS叫法不同 它叫so 即Shared Object 共享对象 (在LINUX下 静态函数库是以 a作后缀的) X WINDOW作为LINUX下的标准图形窗口界面 它本身就采用了很多的动态链接库(在/usr/X R /lib目录下) 以方便程序间的共享 节省占用空间 著名的APACHE网页服务器 也采用了动态链接库 以便扩充程序功能 你只需将PHP动态链接库拷到其共享目录 修改一下配置 APACHE就可以支持PHP网页了 如果你愿意 可以自己编写动态链接库 让APACHE支持你自己定义的网页格式 这就是动态链接的好处 LINUX下动态链接库的创建 在LINUX系统下 创建动态链接库是件再简单不过的事情 只要在编译函数库源程序时加上 shared选项即可 这样所生成的执行程序即为动态链接库 从某种意义上来说 动态链接库也是一种执行程序 按一般规则 程序名应带 so后缀 下面举个例子说说 我准备编写两个函数 一个用于查询当前日期getdate 一个用于查询当前时间gettime 并将这两个函数存于动态链接库my so中 为此 需要做以下几项工作 编写用户接口文件datetime h 内容如下(每行前面的数字为行号) /* datetime h : 纵横软件制作中心雨亦奇编写 */ #ifndef __DATETIME_H #define __DATETIME_H /* 日期结构 */ typedef struct int year; int mon; int day; DATETYPE; /* 时间结构 */ typedef struct char hour; char min; char sec; TIMETYPE; /* 函数原型说明 */ #ifdef SHARED int (*getdate)(DATETYPE *d); #else int getdate(DATETYPE *d); #endif #ifdef SHARED int (*gettime)(TIMETYPE *t); #else int gettime(TIMETYPE *t); #endif #endif 这个用户接口文件中 先定义了日期与时间结构 接着定义一下函数的原型 动态函数与静态函数的原型说明不同的是 动态函数应使用(*函数名)的形式 以便引用其指针 若要引用文件中的动态函数说明 用户应该定义一下SHARED宏 这样才能使用 编写getdate c 源程序如下 /* getdate c : 纵横软件制作中心雨亦奇编写 */ #include time h #include datetime h int getdate(DATETYPE *d) long ti; struct tm *tm; time(&ti); tm=localtime(&ti); d >year=tm >tm_year+ ; d >mon=tm >tm_mon+ ; d >day=tm >tm_mday; 在getdate函数中 先调用time取得以秒计的系统时间 再用localtime函数转换一下时间结构 最后调整得到正确的日期 编写gettime c 源程序如下 /* gettime c : 纵横软件制作中心雨亦奇编写 */ #include time h #include datetime h int gettime(TIMETYPE *t) long ti; struct tm *tm; time(&ti); tm=localtime(&ti); t >hour=tm >tm_hour; t >min=tm >tm_min; t >sec=tm >tm_sec; gettime函数与getdate函数相仿 先用time函数取得以秒计的系统时间 再用localtime函数转换一下时间结构 最后返回当前的时间(不需调整) 编写维护文件makefile lib 内容如下 # makefile lib : 纵横软件制作中心雨亦奇编写 all : my so SRC = getdate c gettime c TGT = $(SRC: c= o) $(SRC) : datetime h @touch $@ % o : % c cc c $? # 动态函数库(my so)生成 my so : $(TGT) cc shared o $@ $(TGT) 编写维护文件的目的 在于方便程序员维护程序 尤其是维护比较大的工程项目 一个素质良好的程序员应该学会熟练地编写维护文件makefile 定义了文件间的依赖关系后 一旦源文件发生变化 仅需make一下 其目标文件维护代码会自动执行 从而自动更新目标文件 减少了许多工作量 注意: 每行维护代码必须以TAB(跳格键)开始 不是的话make时将出错 本维护文件第 行是注释行 以#号开头 文件第 行定义所有需要维护的函数库 第 行定义相关源程序文件 第 行定义目标文件 第 行说明所有源程序依赖于datetime h头文件 并有相应维护代码 即touch一下 更新一下源文件的时间 第 行定义 o文件依赖于相应的 c文件 并指定了维护代码 即用cc编译一下 第 行定义共享库my so依赖的目标文件 维护代码中用 shared编译选项 以生成动态链接库my so 运行make f makefile lib 命令 make运行后 动态链接库my so就产生了 我们就可以在程序中调用了 如果想让系统所有用户都可以使用 则应以root用户登录系统 将这个库拷贝到/lib目录下(命令 cp my so /lib) 或者在/lib目录下建个符号连接即可(命令 ln s `pwd`/my so /lib) LINUX下动态链接库的使用 重要的dlfcn h头文件 LINUX下使用动态链接库 源程序需要包含dlfcn h头文件 此文件定义了调用动态链接库的函数的原型 下面详细说明一下这些函数 dlerror 原型为: const char *dlerror(void); 当动态链接库操作函数执行失败时 dlerror可以返回出错信息 返回值为NULL时表示操作函数执行成功 dlopen 原型为: void *dlopen (const char *filename int flag); dlopen用于打开指定名字(filename)的动态链接库 并返回操作句柄 filename: 如果名字不以/开头 则非绝对路径名 将按下列先后顺序查找该文件 ( ) 用户环境变量中的LD_LIBRARY值 ( ) 动态链接缓冲文件/etc/ld so cache ( ) 目录/lib /usr/lib flag表示在什么时候解决未定义的符号(调用) 取值有两个: ) RTLD_LAZY : 表明在动态链接库的函数代码执行时解决 ) RTLD_NOW : 表明在dlopen返回前就解决所有未定义的符号 一旦未解决 dlopen将返回错误 dlopen调用失败时 将返回NULL值 否则返回的是操作句柄 dlsym : 取函数执行地址 原型为: void *dlsym(void *handle char *symbol); dlsym根据动态链接库操作句柄(handle)与符号(symbol) 返回符号对应的函数的执行代码地址 由此地址 可以带参数执行相应的函数 如程序代码: void (*add)(int x int y); /* 说明一下要调用的动态函数add */ add=dlsym( xxx so add ); /* 打开xxx so共享库 取add函数地址 */ add( ); /* 带两个参数 和 调用add函数 */ dlclose : 关闭动态链接库 原型为: int dlclose (void *handle); dlclose用于关闭指定句柄的动态链接库 只有当此动态链接库的使用计数为 时 才会真正被系统卸载 在程序中使用动态链接库函数 程序范例 下面的程序装载了动态链接库my so 并用getdate gettime取得当前日期与时间后输出 /************************************/ /* 文件名称: dy c */ /* 功能描述: 动态链接库应用示范程序 */ /* 程序编写: 纵横软件制作中心雨亦奇 */ /* 编写时间: */ /************************************/ #include stdio h /* 包含标准输入输出文件 */ #include cha138/Article/program/Oracle/201311/17429相关参考
动态库的生成 /*mysumc*/ 复制代码代码如下: #include<stdioh>#includesrch intsum(intaintb)return(a+b);&
MFC中动态控件的创建与响应 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 动态控件是指在需要时
PHP典型模块与项目实战大全:创建图像和链接 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
Delphi中动态链接库两种调用方式的比较 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一动态链接
知识大全 Delphi 中动态链接库(dll)的建立和使用[2]
Delphi中动态链接库(dll)的建立和使用[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 Delphi 中动态链接库(dll)的建立和使用[1]
Delphi中动态链接库(dll)的建立和使用[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:动态链接库编程(一)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:动态链接库编程(一)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:动态链接库编程(一)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:动态链接库编程(一)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!