linux建立动态库链接,Linux动态链接库.so文件的创建与使用

资料出处:http://linux.chinaitlab.com/administer/803560.html

编 写维护文件的目的,在于方便程序员维护程序,尤其是维护比较大的工程项目。一个素质良好的程序员应该学会熟练地编写维护文件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 */

add=dlsym("xxx.so","add"); /* 打开xxx.so共享库,取add函数地址 */

add(89,369); /* 带两个参数89和369调用add函数 */

2.1.4 dlclose : 关闭动态链接库

原型为: int dlclose (void *handle);

dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。

2.2 在程序中使用动态链接库函数

2.2.1 程序范例

下面的程序装载了动态链接库my.so,并用getdate,gettime取得当前日期与时间后输出。

----------------------------------------------------------------------

1 /************************************/

2 /* 文件名称: dy.c */

3 /* 功能描述: 动态链接库应用示范程序 */

4 /* 程序编写: 纵横软件制作中心雨亦奇 */

5 /* 编写时间: 2001-06-28 */

6 /************************************/

7

8 #include "stdio.h" /* 包含标准输入输出文件 */

9

10 #include "dlfcn.h" /* 包含动态链接功能接口文件 */

11 #define SOFILE "./my.so" /* 指定动态链接库名称 */

12

13 #define SHARED /* 定义宏,确认共享,以便引用动态函数 */

14 #include "datetime.h" /* 包含用户接口文件 */

15

16 main()

17 {

18 DATETYPE d;

19 TIMETYPE t;

20 void *dp;

21 char *error;

22

23 puts("动态链接库应用示范");

24

25 dp=dlopen(SOFILE,RTLD_LAZY); /* 打开动态链接库 */

26

27 if (dp==NULL) /* 若打开失败则退出 */

28 {

29 fputs(dlerror(),stderr);

30 exit(1);

31 }

32

33 getdate=dlsym(dp,"getdate"); /* 定位取日期函数 */

34

35 error=dlerror(); /* 检测错误 */

36 if (error) /* 若出错则退出 */

37 {

38 fputs(error,stderr);

39 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 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

业界 | 德勤预测:机器学习走向移动端成大势所趋,或将再掀行业新浪潮

来源:AI科技评论概要:早在20世纪70、80年代,大部分企业计算都由办公大楼地下室里的大型主机和微型计算机完成,工作人员则在操作由没有机载处理能力的阴极射线管监视器(被称为“绿屏”)和键盘组成的“简易终…

linux常用架构,Linux常用到的一些命令-Go语言中文社区

1.poweroff 关闭系统(1)2.halt 关闭系统(2)3.reboot 重启系统4.pwd 查看当前所在目录的绝对路径5.mkdir 文件名 创建一个目录文件6.rm 文件名 删除文件(如果删除目录文件需要加上-r,如果强制删除需要加上-f)7.cat 文件名 查看文件内容(适合查看短小内容)8.date 查看…

2017年诺奖:百年现代物理学,今天做了个了断!

编者按:2017年诺贝尔物理学奖被授予美国三位科学家Rainer Weiss(雷纳韦斯)、Kip Thorne(基普索恩)、Barry Barish(巴里巴里什),以表彰他们在LIGO检测器和引力波观测的决定性贡献。中…

linux libasan.so,Address Sanitizer 用法

Address Sanitizer(ASan)是一个快速的内存错误检测工具。这里说明它的用法。参考资料1. 简介Address Sanitizer(ASan)是一个快速的内存错误检测工具。它非常快,只拖慢程序两倍左右(比起Valgrind快多了)。它包括一个编译器instrumentation模块和一个提供malloc()/fre…

用深度学习模型,解构并重构人类思维

来源:人机与认知实验室概要:人类的知识,往往由事实 fact 和规则 rule 组成,而且人类习惯于用简练的词汇,来表达事实和规则。所以,维特根斯坦认为,人类思维受制于语言结构,语言的界限…

Ios 12 linux,苹果发布iOS 12.4.1,以修补越狱漏洞

Apple今天发布了针对iPhone和iPad设备的最新iOS 12.4移动操作系统,Apple TV设备的tvOS 12.4以及Apple Watch设备的watchOS 5.3的第一个小Bug和安全更新。iOS 12.4.1是iOS 12.4发布多月后的一项重大更新,引入了新的iPhone迁移功能,允许用户将数…

谷歌AI智商达苹果Siri两倍 但不及6岁儿童

来源:IT之家概要:3名中国研究员近期发表的论文指出,谷歌人工智能技术相对于苹果Siri“智商”明显更高。3名中国研究员近期发表的论文指出,谷歌人工智能技术相对于苹果Siri“智商”明显更高。这篇论文比较了多个人工智能系统。论文…

linux传输文件到linux速度慢,linux中往nand(jffs2)中拷贝文件时速度慢的问题

最近在调试nand和jffs2时,发现将一个文件从SD卡拷贝到jffs2的NAND分区时,速度非常慢,和从NAND中拷出(例如拷贝到SD卡)相比,慢了近5倍。一开始以为是驱动写NAND和读NAND的差异,后来用mtd-utile的nand write测试了一下&a…

Deepmind 预测地图论文背后:神经科学或将助力AI迎来新突破

来源:AI科技评论概要:这篇论文中,Deepmind通过对主管人类长期记忆行为的“海马体”(hippocampus)神经元活动的研究,进一步提出了可以转化为神经网络架构的“预测图”理论。对人类神经网络的理解越来越在左右…

c语言更改编译时字体,c习题编译时出现空的字符常量,怎么修改?

题目要求&#xff1a;统计各个数字&#xff0c;空白符以及所有其他字符出现的次数。[CODE]#include main(){int c, i, nwhite, nother;int ndigit[10];nwhite nother 0;for (i 0; i < 10; i)ndigit[i] 0;while ((c getchar()) ! EOF)if (c > ’0′ && c <…

你所未知的人工智能应用领域

来源&#xff1a;199IT互联网数据中心 概要&#xff1a;一组专家为我们详细描述了随着我们所使用的机器变得越来越智能&#xff0c;我们周围的世界正在如何发生变化的图景。 对有些人来说&#xff0c;人工智能和机器人技术的普及对我们的隐私、工作甚至人身安全构成了威胁&…

c语言高亮字符,C语言必背18个程序+190例--语法高亮

《C语言必背18个程序190例--语法高亮》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《C语言必背18个程序190例--语法高亮(111页珍藏版)》请在人人文库网上搜索。1、C语言必背18个经典程序输入什么显示什么main()int c&#xff1b;cgetchar()&#xff1b;同时(c&#…

原来你是这样子的OpenAI!来看看它背后那些有趣的人和事

来源&#xff1a;AI科技大本营 概要&#xff1a;它的目标非常明确&#xff0c;就是要确保人类安全&#xff0c;确保人类的权益不受未来机器人的影响&#xff0c;确保人类可以长久地与智能机器人共存。 提到OpenAI&#xff0c;业内可谓无人不知&#xff0c;无人不晓。 这可是人气…

C语言for循环的嵌套例题,c语言 for循环的嵌套(含答案)

c语言 for循环的嵌套(含答案)第 33、34 课时 for 循环的嵌套实验题一&#xff1a;1、下面程序的功能是计算:至 50 中是 7 的倍数的数值之和,请选择填空。D#include main() int i,sum 0; for(i1;i Bmain() int a,b,c,i; ac0; for(i0;imain() int i; #imain() int x,i; for(i1;im…

c语言bellman算法,求 最短路径中BELLMAN FORD算法实现的C程序

匿名用户1级2010-06-01 回答//这个是邻接表typedef struct oo{int len,num;struct oo *next;} link;typedef struct{int num;link *next;} graph;/*node[]图的邻接表n节点总数s源点dis[]到源点的最短路径长度pre[]最短路径上的前驱结点算法返回true&#xff0c;当且仅当途中不包…

Gartner十大IT预测:七大数字巨头,有五家将心甘情愿“自我颠覆”

来源&#xff1a;凤凰科技 概要&#xff1a;Gartner的预测&#xff0c;以及支持这些预测的假设&#xff0c;表明企业首席信息官必须首先是业务战略师&#xff0c;然后才是技术专家。 Gartner的预测&#xff0c;以及支持这些预测的假设&#xff0c;表明企业首席信息官必须首先是…

谷歌花4亿英镑下注AI开始有回报 DeepMind创收了

来源&#xff1a;腾讯科技 概要&#xff1a;DeepMind虽然还保持独立运营&#xff0c;但其对于谷歌产品的贡献恰逢其时。该公司2016年对于Alphabet其他公司的产品和服务所作出的贡献价值4000万英镑&#xff0c;这也是该公司首次创收。 外媒指出&#xff0c;Alphabet子公司谷歌周…

2016全球教育机器人发展白皮书

来源&#xff1a;199IT互联网数据中心 概要&#xff1a;白皮书梳理了全球教育机器人发展现状与趋势。从教育机器人的全球重要研究机构、市场产品评测、需求调研、产业链分析及未来市场发展预测&#xff0c;进行阐述。 白皮书梳理了全球教育机器人发展现状与趋势。从教育机器人的…

android上的java编译器,Android Studio:需要一个java编译器

我在尝试运行android应用程序时遇到错误。我在Windows 8 64位上运行android studio 0.3.2。Android Studio&#xff1a;需要一个java编译器这里的错误java: System Java Compiler was not found in classpath:java.lang.ClassNotFoundException: com.sun.tools.javac.api.Javac…

谷歌硬件战略缺陷:无法围绕谷歌助手打造硬件体系

来源&#xff1a;元器件交易网 概要&#xff1a;谷歌希望大规模销售基于谷歌助手的硬件&#xff0c;战略调整或许是其中重要的一步。 谷歌是否犯了重大错误&#xff1f; 谷歌正在以“人工智能优先”的战略取代此前“移动优先”的战略&#xff0c;并公开地推进这一战略。这是个大…