您的位置:新葡亰496net > 服务器网络 > LINUX动态链接库的创建与使用,linux动态链接库

LINUX动态链接库的创建与使用,linux动态链接库

发布时间:2019-06-22 18:24编辑:服务器网络浏览(181)

    Linux下动态链接库管理,linux动态链接库

    一. ldd命令

    ldd 查看程序注重库
    ldd作用:用来查看程式运营所需的共享库,常用来解决程式因缺乏有个别库文件而不可能运作的局地难点。
    亲自过问:查看test程序运营所依赖的库:

    /opt/app/todeav1/test$ldd test
    libstdc .so.6 => /usr/lib64/libstdc .so.6 (0x00000039a7e00000)
    libm.so.6 => /lib64/libm.so.6 (0x0000003996400000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000039a5600000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003995800000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003995400000)

    •第一列:程序须要借助什么库
    •第二列: 系统提供的与程序须要的库所对应的库
    •第三列:库加载的起来地址

    经过地方的音讯,我们得以获得以下多少个音讯:
    1.经过对照第一列和第二列,大家能够剖判程序需求依据的库和系统实际提供的,是或不是相匹配
    2.通过观看第三列,大家能够领略在当下的库中的符号在对应的经过的地方空间中的开第叁地点

    若是借助的某部库找不到,通过这一个命令能够赶快定位难题所在;

    原理: ldd不是个可实施程式,而只是个shell脚本; ldd突显可进行模块的dependency的干活原理,其实质是因此ld-linux.so(elf动态库的装载器)来达成的。ld-linux.so模块会先于executable模块程式专门的学问,并获取调整权,由此当上述的那多少个遭受变量被装置时,ld-linux.so选用了呈现可进行模块的dependency。

    二. ldconfig命令

    ldconfig是三个动态链接库管理命令,其指标为了让动态链接库为系统所共享。

    ldconfig的首要用途:

    默许搜寻/lilb和/usr/lib,以及安插文件/etc/ld.so.conf内所列的目录下的库文件。

    追寻出可共享的动态链接库,库文件的格式为:lib***.so.**,进而成立出动态装入程序(ld.so)所需的连接和缓存文件。

    缓存文件默以为/etc/ld.so.cache,该文件保留已排好序的动态链接库名字列表。

    ldconfig经常在系统运维时运维,而当用户安装了多少个新的动态链接库时,就供给手工业运营这几个命令。

    ldconfig命令参数表达:

    1、 -v或--verbose:用此选项时,ldconfig将显得正在扫描的目录及查找到的动态链接库,还会有它所成立的连天的名字.

    2、-n :用此选项时,ldconfig仅扫描命令行内定的目录,不扫描默许目录(/lib,/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录.

    3、-N :此选项提醒ldconfig不重建缓存文件(/etc/ld.so.cache).若未用-X选项,ldconfig照常更新文件的连接.

    4、-X : 此选项提示ldconfig不革新文件的连接.若未用-N选项,则缓存文件不荒谬更新.

    5、-f CONF : 此选项钦赐动态链接库的布署文件为CONF,系统默以为/etc/ld.so.conf.

    6、-C CACHE :此选项钦点生成的缓存文件为CACHE,系统私下认可的是/etc/ld.so.cache,此文件存放已排好序的可共享的动态链接库的列表.

    7、-r ROOT :此选项改造应用程序的根目录为ROOT(是调用chroot函数完结的).选用此项时,系统私下认可的布置文件/etc/ld.so.conf,实际对应的为ROOT/etc/ld.so.conf.如用-r/usr/zzz时,展开配置文件/etc/ld.so.conf时,实际张开的是/usr/zzz/etc/ld.so.conf文件.用此选项,能够大大扩充动态链接库管理的灵巧性.

    8、-l :经常状态下,ldconfig寻找动态链接库时将自行创建动态链接库的连接.采纳此项时,将进入专家情势,需求手工业安装连接.一般用户毫无此项.

    9、-p或--print-cache :此选项提示ldconfig打字与印刷出脚下缓存文件所保存的有所共享库的名字.

    10、-c FORMAT 或--format=FORMAT :此选项用于内定缓存文件所使用的格式,共有三种:ld(老格式),new(新格式)和compat(包容格式,此为暗中认可格式).

    11、-V : 此选项打字与印刷出ldconfig的版本消息,而后退出.

    12、- 或 --help 或--usage : 那八个采用成效同样,都以让ldconfig打印出其推来推去新闻,而后退出。

    ldconfig须求小心的地点:

    1、往/lib和/usr/lib中间加东西,是决不修改/etc/ld.so.conf文件的,可是增多完后急需调用下ldconfig,不然增多的library会找不到。

    2、倘使加上的library不在/lib和/usr/lib里面包车型地铁话,就必将在修改/etc/ld.so.conf文件,往该公文追加library所在的门路,然后也急需再行调用下ldconfig命令。例如在安装MySQL的时候,其库文件/usr/local/mysql/lib,就须求充实到/etc/ld.so.conf文件中。命令如下:

    # echo"/usr/local/mysql/lib" >> /etc/ld.so.conf

    #ldconfig -v | grep mysql

    三. LD_LIBRARY_PATH

    若果加上的library不在/lib或/usr/lib下,然而却尚无权限操。写/etc/ld.so.conf文件的话,那时就需求往export里写八个大局变量LD_LIBRARY_PATH,就足以了。

     

    一、ldconfig

     

     

    ldd 查看程序信赖库
    ldd成效:用来查阅程式运转所需的共享库,常用来解决程式因缺少某些库文件而不可能运作的部分难题。
    亲自去做:查看test程序运维所重视的库:

          ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运转动态链接库的保管命令--ldconfig。 ldconfig 命令的用途,重若是在私下认可搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创立出动态装入程序(ld.so)所需的连接和缓存文件,缓存文件暗中认可为/etc/ld.so.cache,此文件保留已排好序的动态链接库名字列表。

     

     

     

          linux下的共享库机制选拔了临近于高速缓存的体制,将库音讯保存在/etc/ld.so.cache里边,程序连接的时候首先从那么些文件之中找找,然后再到ld.so.conf的门径里边去详细找,那便是为何修改了ld.so.conf要再一次运转一下ldconfig的原因。

     

     

    /opt/app/todeav1/test$ldd test
    libstdc .so.6 => /usr/lib64/libstdc .so.6 (0x00000039a7e00000)
    libm.so.6 => /lib64/libm.so.6 (0x0000003996400000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000039a5600000)
    LINUX动态链接库的创建与使用,linux动态链接库。libc.so.6 => /lib64/libc.so.6 (0x0000003995800000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003995400000)

    ldconfig几个要求注意的地点:

    一,LINUX系统中动态链接库的创制与利用

    一,LINUX系统中动态链接库的创建与行使

     

    1)往/lib和/usr/lib里边加东西,是不用修改/etc/ld.so.conf的,不过成功之后要调一下ldconfig,否则这么些library会找不到;

    世家都清楚,在WINDOWS系统中有广大的动态链接库(以.DLL为后缀的文书,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库不一样,它在这之中的函数并不是实践顺序自身的一片段,而是依照推行顺序供给按需装入,同时其实行代码可在多个施行顺序间共享,节省了上空,升高了频率,具有极高的狡猾,得到更进一步多技术员和用户的重申。那么,在LINUX系统中有无那样的函数库呢?

    我们都知道,在WINDOWS系统中有那多少个的动态链接库(以.DLL为后缀的文本,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库不一样,它里面包车型大巴函数并不是实践顺序自个儿的一有的,而是基于实行顺序要求按需装入,同期其进行代码可在多个实践顺序间共享,节省了空中,升高了效用,具有非常高的八面见光,获得进一步多程序猿和用户的尊重。那么,在LINUX系统中有无那样的函数库呢?

    •第一列:程序要求借助什么库
    •第二列: 系统提供的与程序须求的库所对应的库
    •第三列:库加载的初始地址

    2)想往上边三个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,否则也会找不到。譬喻设置了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib上边,那时就须求在/etc/ld.so.conf下边加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的library才具在 程序运维时被找到;

    答案是一定的,LINUX的动态链接库不仅仅有,而且大多。在/lib目录下,就有十分多以.so作后缀的文书,那便是LINUX系统应用的动态链接库,只可是与WINDOWS叫法不相同,它叫so,即Shared Object,共享对象。(在LINUX下,静态函数库是以.a作后缀的) X-WINDOW作为LINUX下的科班图形窗口界面,它本人就应用了大多的动态链接库(在/usr/X11PRADO6/lib目录下),以利于程序间的共享,节省占用空间。盛名的APACHE网页服务器,也选拔了动态链接库,以便扩大程序功效。你只需将PHP动态链接库拷到其共享目录,修改一下安插,APACHE就可以扶助PHP网页了。假如你愿意,能够自个儿编写动态链接库,让APACHE帮忙你协调定义的网页格式。那正是动态链接的益处。

    答案是必然的,LINUX的动态链接库不仅仅有,而且十分的多。在/lib目录下,就有多数以.so作后缀的文件,那就是LINUX系统应用的动态链接库,只可是与WINDOWS叫法不一致,它叫so,即Shared Object,共享对象。(在LINUX下,静态函数库是以.a作后缀的) X-WINDOW作为LINUX下的正儿八经图形窗口分界面,它本人就使用了相当的多的动态链接库(在/usr/X11奥德赛6/lib目录下),以造福程序间的共享,节省占用空间。出名的APACHE网页服务器,也利用了动态链接库,以便扩展程序作用。你只需将PHP动态链接库拷到其共享目录,修改一下配备,APACHE就能够扶助PHP网页了。倘若您愿意,可以本身编排动态链接库,让APACHE帮忙你和煦定义的网页格式。这正是动态链接的益处。

     

    3)就算想在那四个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或然是从未权限加东西)。那也足以,正是export叁个大局变 量LD_LIBRARY_PATH,然后运转程序的时候就能去那几个目录中找library。一般来说那只是一种近期的缓和方案,在未曾权限或一时半刻要求的时候利用;

    1、LINUX下动态链接库的创造

    1、LINUX下动态链接库的创始

    透过地点的音讯,我们得以博得以下多少个音信:
    1.由此对照第一列和第二列,大家得以深入分析程序须求重视的库和系统实际提供的,是还是不是相相称
    2.通过观看第三列,大家能够领略在时下的库中的符号在对应的长河的地址空间中的开端地点

    4)ldconfig做的那几个事物都与运转程序时有关,跟编写翻译时一点关乎都未有。编写翻译的时候依旧该加-L就得加,不要混淆了;

    在LINUX系统下,创制动态链接库是件再轻易但是的事务。只要在编写翻译函数库源程序时抬高-shared选项就可以,那样所生成的奉行顺序即为动态链接库。从某种意义上的话,动态链接库也是一种奉行顺序。按一般规则,程序名应带.so后缀。上边举个例子说说。

    在LINUX系统下,创造动态链接库是件再轻便可是的职业。只要在编写翻译函数库源程序时抬高-shared选项就能够,那样所生成的推行顺序即为动态链接库。从某种意义上来讲,动态链接库也是一种实践顺序。按一般规则,程序名应带.so后缀。上面举个例子说说。

     

    5)不问可见,就是不论做了何等有关library的改观后,最棒都ldconfig一下,不然会并发一些出乎意料的结果。不会花太多的时刻,可是会省许多的事。

    自己图谋编写五个函数,多少个用以查询当前几天期getdate,一个用于查询当前光阴gettime,并将那五个函数存于动态链接库my.so中。为此,须求做以下几项专门的学问。

    自身希图编写七个函数,一个用来查询当今天期getdate,一个用来查询当前岁月gettime,并将那多个函数存于动态链接库my.so中。为此,须求做以下几项专业。

    假定依附的有些库找不到,通过这一个命令能够长足定位难题所在;

    ldconfig命令行用法如下:

    1.1 编写用户接口文件datetime.h,内容如下(每行前面包车型客车数字为行号):

    1.1 编写用户接口文件datetime.h,内容如下(每行前面包车型客车数字为行号):

     

    ldconfig [-v|--verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|--print-cache]

    1 /* datetime.h : 驰骋软件制作中央雨亦奇编写, 二零零四-06-28. */

    1 /* datetime.h : 驰骋软件制作中央雨亦奇编写, 二〇〇〇-06-28. */

    注解

    [-c FORMAT] [--format=FORMAT] [-V] [-?|--help|--usage] path...

    2

    2

     

    ldconfig可用的挑选表明如下:

    3 #ifndef __DATETIME_H

    3 #ifndef __DATETIME_H

    规律: ldd不是个可施行程式,而只是个shell脚本; ldd呈现可进行模块的dependency的职业规律,其实质是由此ld-linux.so(elf动态库的装载器)来兑现的。ld-linux.so模块会先于executable模块程式职业,并赢得调控权,因而当上述的那多少个情状变量被安装时,ld-linux.so选择了展示可推行模块的dependency。

    1) -v或--verbose : 用此选项时,ldconfig将展现正在扫描的目录及查找到的动态链接库,还应该有它所开创的连日的名字;

    4

    4

     

    2)-n : 用此选项时,ldconfig仅扫描命令行钦点的目录,不扫描默许目录(/lib,/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录;

    5 #define __DATETIME_H

    5 #define __DATETIME_H


    3)-N : 此选项提醒ldconfig不重建缓存文件(/etc/ld.so.cache),若未用-X选项,ldconfig照常更新文件的连接;

    6

    6

     

    4)-X : 此选项提示ldconfig不立异文件的连年,若未用-N选项,则缓存文件正常更新;

    7 /* 日期结构*/

    7 /* 日期结构*/

    ldconfig是八个动态链接库处理命令,为了让动态链接库为系统所共享,还需运营动态链接库的管制命令–ldconfig。 ldconfig 命令的用途,重如果在默许搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,找出出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创造出动态装入程序(ld.so)所需的连日和缓存文件.缓存文件默感到/etc/ld.so.cache,此文件保留已排好序的动态链接库名字列表.

    5)-f CONF : 此选项钦点动态链接库的布局文件为CONF,系统默感觉/etc/ld.so.conf;

    8 typedef struct

    8 typedef struct

     

    6)-C CACHE : 此选项钦点生成的缓存文件为CACHE,系统暗中认可的是/etc/ld.so.cache,此文件存放已排好序的可共享的动态链接库的列表;

    9{

    9{

    linux下的共享库机制选取了看似于高速缓存的建制,将库新闻保存在/etc/ld.so.cache里边。

    7)-r ROOT : 此选项改换应用程序的根目录为ROOT(是调用chroot函数完毕的),选拔此项时,系统默许的布置文件 /etc/ld.so.conf,实际对应的为 ROOT/etc/ld.so.conf。如用-r /usr/zzz时,张开配置文件 /etc/ld.so.conf时,实际张开的是/usr/zzz/etc/ld.so.conf文件,用此选项,能够大大增添动态链接库管理的狡猾;

    10 int year;

    10 int year;

     

    8)-l : 平常情况下,ldconfig找寻动态链接库时将自动创设动态链接库的总是,选拔此项时,将进入专家形式,须求手工业安装连接,一般用户毫无此项;

    11 int mon;

    11 int mon;

    先后连接的时候首先从那些文件之中找找,然后再到ld.so.conf的路子里边去详细找。

    9)-p或--print-cache : 此选项提醒ldconfig打字与印刷出如今缓存文件所保存的装有共享库的名字;

    12 int day;

    12 int day;

     

    10)-c FORMAT 或 --format=FORMAT : 此选项用于钦点缓存文件所运用的格式,共有三种: ld(老格式),new(新格式)和compat(包容格式,此为暗许格式);

    13 }DATETYPE;

    13 }DATETYPE;

    那正是为啥修改了ld.so.conf要再度运转一下ldconfig的开始和结果

    11)-V : 此选项打字与印刷出ldconfig的版本新闻,而后退出;

    14

    14

     

    12)-? 或 --help 或 --usage : 那八个选用作用同样,都以让ldconfig打字与印刷出其拉拉扯扯音讯,而后退出。

    15 /* 时间结构*/

    15 /* 时间结构*/

    补充有些,ldconfig在/sbin里面。

    二、ldd

    16 typedef struct

    16 typedef struct

     

    功用:用来查看程序运维所需的共享库,常用来减轻程序因缺乏有个别库文件而没办法运作的片段标题。

    17 {

    17 {

    ldconfig几个必要注意的地点

    ldd命令原理

    18 char hour;

    18 char hour;

     

    1、首先ldd不是三个可推行程序,而只是三个shell脚本;

    19 char min;

    19 char min;

    1. 往/lib和/usr/lib里面加东西,是决不修改/etc/ld.so.conf的,可是变成之后要调一下ldconfig,否则这么些library会找不到

    2、ldd能够显得可进行模块的dependency,其原理是经过安装一文山会海的境况变量,如:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS情形变量不为空时,任何可试行程序在运营时,它都会只呈现模块的dependency,而先后并不真的施行。能够在shell终端测试一下:
    (1) export LD_TRACE_LOADED_OBJECTS=1

    20 char sec;

    20 char sec;

     

    (2) 再实践其余的先后,如ls等,看看程序的周转结果

    21 }TIMETYPE;

    21 }TIMETYPE;

    2. 想往上边四个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到

    3、ldd呈现可举行模块的dependency的办事原理,其实质是通过ld-linux.so(elf动态库的装载器)来促成的。我们领略,ld-linux.so模块会先于executable模块程序职业,并拿走调控权,因而当上述的这些境况变量被设置时,ld-linux.so选取了展示可施行模块的dependency。

    22

    22

     

    4、实际上可以直接试行ld-linux.so模块,如:/lib/ld-linux.so.2 --list program(这一定于ldd program)。

    23 /* 函数原型表达*/

    23 /* 函数原型表明*/

    举例说设置了七个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql /lib上面,那时 就供给在/etc/ld.so.conf下边加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的library工夫在 程序运维时被找到。

    24

    24

     

    25 #ifdef SHARED

    25 #ifdef SHARED

    3. 比如想在那多个目录以外放lib,可是又不想在/etc/ld.so.conf中加东西(或然是绝非权限加东西)。那也足以,正是export三个大局变 量LD_LIBRARY_PATH,然后运转程序的时候就能够去那个目录中找library。一般来说那只是一种暂且的消除方案,在一贯不权限或权且需求的时 候使用。

    26 int (*getdate)(DATETYPE *d);

    26 int (*getdate)(DATETYPE *d);

     

    27 #else

    27 #else

    4. ldconfig做的这个事物都与运作程序时有关,跟编写翻译时一点关联都尚未。编写翻译的时候依然该加-L就得加,不要混淆了。

    28 int getdate(DATETYPE *d);

    28 int getdate(DATETYPE *d);

     

    29 #endif

    29 #endif

    5. 同理可得,正是不管做了什么有关library的改观后,最棒都ldconfig一下,不然会合世一些意想不到的结果。不会花太多的时刻,可是会省好多的事。

    30

    30

    本文恒久更新链接地址:http://www.linuxidc.com/Linux/2017-01/139071.htm

    31 #ifdef SHARED

    31 #ifdef SHARED

    新葡亰496net 1

    32 int (*gettime)(TIMETYPE *t);

    32 int (*gettime)(TIMETYPE *t);

    33 #else

    33 #else

    34 int gettime(TIMETYPE *t);

    34 int gettime(TIMETYPE *t);

    35 #endif

    35 #endif

    36

    36

    37 #endif

    37 #endif

    38

    38



    那么些用户接口文件中,先定义了日期与时间结构,接着定义一下函数的原型。动态函数与静态函数的原型表达差别的是,动态函数应选用(*函数名)的款式,以便引用其指针。若要引用文件中的动态函数表明,用户应该定义一下SHARED宏,那样技术运用。

    那一个用户接口文件中,先定义了日期与时间结构,接着定义一下函数的原型。动态函数与静态函数的原型表明不一致的是,动态函数应利用(*函数名)的款型,以便引用其指针。若要引用文件中的动态函数说明,用户应该定义一下SHARED宏,那样技巧选用。

    1.2 编写getdate.c,源程序如下:

    1.2 编写getdate.c,源程序如下:



    1 /* getdate.c : 驰骋软件制作中央雨亦奇编写, 二零零一-06-28. */

    1 /* getdate.c : 驰骋软件制作主题雨亦奇编写, 二零零二-06-28. */

    2

    2

    3 #include "time.h"

    3 #include "time.h"

    4 #include "datetime.h"

    4 #include "datetime.h"

    5

    5

    6 int getdate(DATETYPE *d)

    6 int getdate(DATETYPE *d)

    7 {

    7 {

    8 long ti;

    8 long ti;

    9 struct tm *tm;

    9 struct tm *tm;

    10

    10

    11 time(&ti);

    11 time(&ti);

    12 tm=localtime(&ti);

    12 tm=localtime(&ti);

    13 d->year=tm->tm_year 1900;

    13 d->year=tm->tm_year 1900;

    14 d->mon=tm->tm_mon 1;

    14 d->mon=tm->tm_mon 1;

    15 d->day=tm->tm_mday;

    15 d->day=tm->tm_mday;

    16 }

    16 }

    17

    17



    在getdate函数中,先调用time获得以秒计的种类时间,再用localtime函数转变一下岁月组织,最后调度获得正确的日期。

    在getdate函数中,先调用time猎取以秒计的系统时间,再用localtime函数调换一下光阴组织,最后调解取得精确的日期。

    1.3 编写gettime.c,源程序如下:

    1.3 编写gettime.c,源程序如下:



    1 /* gettime.c : 驰骋软件制作宗旨雨亦奇编写, 2004-06-28. */

    1 /* gettime.c : 纵横软件制作宗旨雨亦奇编写, 2002-06-28. */

    2

    2

    3 #include "time.h"

    3 #include "time.h"

    4 #include "datetime.h"

    4 #include "datetime.h"

    5

    5

    6 int gettime(TIMETYPE *t)

    6 int gettime(TIMETYPE *t)

    7 {

    7 {

    8 long ti;

    8 long ti;

    9 struct tm *tm;

    9 struct tm *tm;

    10

    10

    11 time(&ti);

    11 time(&ti);

    12 tm=localtime(&ti);

    12 tm=localtime(&ti);

    新葡亰496net,13 t->hour=tm->tm_hour;

    13 t->hour=tm->tm_hour;

    14 t->min=tm->tm_min;

    14 t->min=tm->tm_min;

    15 t->sec=tm->tm_sec;

    15 t->sec=tm->tm_sec;

    16 }

    16 }

    17

    17



    gettime函数与getdate函数相仿,先用time函数获得以秒计的体系时间,再用localtime函数转换一下日子结构,最后回到当前的光阴(不需调解)。

    gettime函数与getdate函数相仿,先用time函数猎取以秒计的体系时间,再用localtime函数调换一下时间结构,最终回到当前的小时(不需调节)。

    1.4 编写维护文件makefile-lib,内容如下:

    1.4 编写维护文件makefile-lib,内容如下:

    1 # makefile-lib : 驰骋软件制作主题雨亦奇编写, 二〇〇一-06-28.

    1 # makefile-lib : 驰骋软件制作中央雨亦奇编写, 2003-06-28.

    2

    2

    3 all : my.so

    3 all : my.so

    4

    4

    5 SRC = getdate.c gettime.c

    5 SRC = getdate.c gettime.c

    6

    6

    7 TGT = $(SRC:.c=.o)

    7 TGT = $(SRC:.c=.o)

    8

    8

    9 $(SRC) : datetime.h

    9 $(SRC) : datetime.h

    10 @touch [email protected]

    10 @touch $@

    11

    11

    12 %.o : %.c

    12 %.o : %.c

    13 cc -c $?

    13 cc -c $?

    14

    14

    15 # 动态函数库(my.so)生成

    15 # 动态函数库(my.so)生成

    16 my.so : $(TGT)

    16 my.so : $(TGT)

    17 cc -shared -o [email protected] $(TGT)

    17 cc -shared -o $@ $(TGT)

    18

    18



    编写维护文件的目的,在于方便程序员维护程序,尤其是维护比较大的工程项目。一个素质良好的程序员应该学会熟练地编写维护文件makefile。定义了文件间的依赖关系后,一旦源文件发生变化,仅需make一下,其目标文件维护代码会自动执行,从而自动更新目标文件,减少了许多工作量。注意: 每行维护代码必须以TAB(跳格键)开始,不是的话make时将出错。

    编写维护文件的目的,在于方便程序员维护程序,尤其是维护比较大的工程项目。一个素质良好的程序员应该学会熟练地编写维护文件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行是注释行,以#号开头;文件第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 命令

    1.5 运行make -f makefile-lib 命令

     

     

     

     

    make运行后,动态链接库my.so就产生了,我们就可以在程序中调用了。如果想让系统所有用户都可以使用,则应以root用户登录系统,将这个库拷贝到/lib目录下(命令:cp my.so /lib),或者在/lib目录下建个符号连接即可(命令:ln -s `pwd`/my.so /lib)。

    make运行后,动态链接库my.so就产生了,我们就可以在程序中调用了。如果想让系统所有用户都可以使用,则应以root用户登录系统,将这个库拷贝到/lib目录下(命令:cp my.so /lib),或者在/lib目录下建个符号连接即可(命令:ln -s `pwd`/my.so /lib)。

     

     

     

     

    2、LINUX下动态链接库的使用

    2、LINUX下动态链接库的使用

     

     

     

     

    2.1 重要的dlfcn.h头文件

    2.1 重要的dlfcn.h头文件

     

     

     

     

    LINUX下使用动态链接库,源程序需要包含dlfcn.h头文件,此文件定义了调用动态链接库的函数的原型。下面详细说明一下这些函数。

    LINUX下使用动态链接库,源程序需要包含dlfcn.h头文件,此文件定义了调用动态链接库的函数的原型。下面详细说明一下这些函数。

     

     

     

     

    2.1.1dlerror

    2.1.1dlerror

     

     

     

     

    原型为: const char *dlerror(void);

    原型为: const char *dlerror(void);

     

     

     

     

    当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。

    当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。

     

     

     

     

    2.1.2dlopen

    2.1.2dlopen

     

     

     

     

    原型为: void *dlopen (const char *filename, int flag);

    原型为: void *dlopen (const char *filename, int flag);

     

     

     

     

    dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。

    dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。

     

     

     

     

    filename: 如果名字不以/开头,则非绝对路径名,将按下列先后顺序查找该文件。

    filename: 如果名字不以/开头,则非绝对路径名,将按下列先后顺序查找该文件。

     

     

     

     

    (1) 用户环境变量中的LD_LIBRARY值;

    (1) 用户环境变量中的LD_LIBRARY值;

     

     

     

     

    (2) 动态链接缓冲文件/etc/ld.so.cache

    (2) 动态链接缓冲文件/etc/ld.so.cache

     

     

     

     

    (3) 目录/lib,/usr/lib

    (3) 目录/lib,/usr/lib

     

     

     

     

    flag表示在什么时候解决未定义的符号(调用)。取值有两个:

    flag表示在什么时候解决未定义的符号(调用)。取值有两个:

     

     

     

     

    1) RTLD_LAZY : 表明在动态链接库的函数代码执行时解决。

    1) RTLD_LAZY : 表明在动态链接库的函数代码执行时解决。

     

     

     

     

    2) RTLD_NOW : 表明在dlopen返回前就解决所有未定义的符号,一旦未解决,dlopen将返回错误。

    2) RTLD_NOW : 表明在dlopen返回前就解决所有未定义的符号,一旦未解决,dlopen将返回错误。

     

     

     

     

    dlopen调用失败时,将返回NULL值,否则返回的是操作句柄。

    dlopen调用失败时,将返回NULL值,否则返回的是操作句柄。

     

     

     

     

    2.1.3dlsym : 取函数执行地址

    2.1.3dlsym : 取函数执行地址

     

     

     

     

    原型为: void *dlsym(void *handle, char *symbol);

    原型为: void *dlsym(void *handle, char *symbol);

     

     

     

     

    dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。由此地址,可以带参数执行相应的函数。

    dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。由此地址,可以带参数执行相应的函数。

     

     

     

     

    如程序代码: void (*add)(int x,int y); /* 说明一下要调用的动态函数add */

    如程序代码: void (*add)(int x,int y); /* 说明一下要调用的动态函数add */

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

    2.1.4dlclose : 关闭动态链接库

    2.1.4dlclose : 关闭动态链接库

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

    2.2.1程序范例

    2.2.1程序范例

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

    7

    7

     

     

     

     

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

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

     

     

     

     

    9

    9

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

    12

    12

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

    15

    15

     

     

     

     

    16 main()

    16 main()

     

     

     

     

    17 {

    17 {

     

     

     

     

    18 DATETYPE d;

    18 DATETYPE d;

     

     

     

     

    19 TIMETYPE t;

    19 TIMETYPE t;

     

     

     

     

    20 void *dp;

    20 void *dp;

     

     

     

     

    21 char *error;

    21 char *error;

     

     

     

     

    22

    22

     

     

     

     

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

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

     

     

     

     

    24

    24

     

     

     

     

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

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

     

     

     

     

    26

    26

     

     

     

     

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

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

     

     

     

     

    28 {

    28 {

     

     

     

     

    29 fputs(dlerror(),stderr);

    29 fputs(dlerror(),stderr);

     

     

     

     

    30 exit(1);

    30 exit(1);

     

     

     

     

    31 }

    31 }

     

     

     

     

    32

    32

     

     

     

     

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

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

     

     

     

     

    34

    34

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

    37 {

    37 {

     

     

     

     

    38 fputs(error,stderr);

    38 fputs(error,stderr);

     

     

     

     

    39 exit(1);

    39 exit(1);

     

     

     

     

    40 }

    40 }

     

     

     

     

    41

    41

     

     

     

     

    42 getdate(&d); /* 调用此共享函数*/

    42 getdate(&d); /* 调用此共享函数*/

     

     

     

     

    43 printf("当前日期: d-d-d/n",d.year,d.mon,d.day);

    43 printf("当前日期: d-d-d/n",d.year,d.mon,d.day);

     

     

     

     

    44

    44

     

     

     

     

    45 gettime=dlsym(dp,"gettime"); /* 定位取时间函数*/

    45 gettime=dlsym(dp,"gettime"); /* 定位取时间函数*/

     

     

     

     

    46

    46

     

     

     

     

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

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

     

     

     

     

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

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

     

     

     

     

    49 {

    49 {

     

     

     

     

    50 fputs(error,stderr);

    50 fputs(error,stderr);

     

     

     

     

    51 exit(1);

    51 exit(1);

     

     

     

     

    52 }

    52 }

     

     

     

     

    53

    53

     

     

     

     

    54 gettime(&t); /* 调用此共享函数*/

    54 gettime(&t); /* 调用此共享函数*/

     

     

     

     

    55 printf("当前时间: d:d:d/n",t.hour,t.min,t.sec);

    55 printf("当前时间: d:d:d/n",t.hour,t.min,t.sec);

     

     

     

     

    56

    56

     

     

     

     

    57 dlclose(dp); /* 关闭共享库*/

    57 dlclose(dp); /* 关闭共享库*/

     

     

     

     

    58

    58

     

     

     

     

    59 exit(0); /* 成功返回*/

    59 exit(0); /* 成功返回*/

     

     

     

     

    60

    60

     

     

     

     

    61 }

    61 }

     

     

     

     

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

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

     

     

     

     

    程序说明:

    程序说明:

     

     

     

     

    第8行: 包含标准输入输出头文件,因为程序中使用了printf,puts,fputs等标准输入输出函数,需要让编译器根据头文件中函数的原型,检查一下语法;

    第8行: 包含标准输入输出头文件,因为程序中使用了printf,puts,fputs等标准输入输出函数,需要让编译器根据头文件中函数的原型,检查一下语法;

     

     

     

     

    第10-11行: 包含动态链接库功能头文件,并定义动态链接库名称;

    第10-11行: 包含动态链接库功能头文件,并定义动态链接库名称;

     

     

     

     

    第13-14行: 定义宏SHARED以便引用14行的头文件datetime.h中的动态函数说明;

    第13-14行: 定义宏SHARED以便引用14行的头文件datetime.h中的动态函数说明;

     

     

     

     

    第25行: 用dlopen打开SOFILE共享库,返回句柄dp;

    第25行: 用dlopen打开SOFILE共享库,返回句柄dp;

     

     

     

     

    第27-31行: 检测dp是否为空,为空则显示错误后退出;

    第27-31行: 检测dp是否为空,为空则显示错误后退出;

     

     

     

     

    第33行: 用dlsym取得getdate函数动态地址;

    第33行: 用dlsym取得getdate函数动态地址;

     

     

     

     

    第35-40行: 如果dlerror返回值不为空,则dlsym执行出错,程序显示错误后退出;

    第35-40行: 如果dlerror返回值不为空,则dlsym执行出错,程序显示错误后退出;

     

     

     

     

    第42-43行: 执行getdate调用,输出当前日期;

    第42-43行: 执行getdate调用,输出当前日期;

     

     

     

     

    第45行: 用dlsym取得gettime函数动态地址;

    第45行: 用dlsym取得gettime函数动态地址;

     

     

     

     

    第47-52行: 如果dlerror返回值不为空,则dlsym执行出错,程序显示错误后退出;

    第47-52行: 如果dlerror返回值不为空,则dlsym执行出错,程序显示错误后退出;

     

     

     

     

    第54-55行: 执行gettime调用,输出当前时间;

    第54-55行: 执行gettime调用,输出当前时间;

     

     

     

     

    第57行: 用dlclose关闭dp所指示的动态链接库;

    第57行: 用dlclose关闭dp所指示的动态链接库;

     

     

     

     

    第59行: 程序退出,返回0值。

    第59行: 程序退出,返回0值。

     

     

     

     

    2.2.2编写维护文件

    2.2.2编写维护文件

     

     

     

     

    维护文件makefile内容如下:

    维护文件makefile内容如下:

     

     

     

     

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

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

     

     

     

     

    1 # makefile : 纵横软件制作中心雨亦奇编写, 2001-06-28.

    1 # makefile : 纵横软件制作中心雨亦奇编写, 2001-06-28.

     

     

     

     

    2

    2

     

     

     

     

    3 all : dy

    3 all : dy

     

     

     

     

    4

    4

     

     

     

     

    5 DYSRC = dy.c

    5 DYSRC = dy.c

     

     

     

     

    6

    6

     

     

     

     

    7 DYTGT = $(DYSRC:.c=.o)

    7 DYTGT = $(DYSRC:.c=.o)

     

     

     

     

    8

    8

     

     

     

     

    9 %.o : %.c

    9 %.o : %.c

     

     

     

     

    10 cc -c $?

    10 cc -c $?

     

     

     

     

    11

    11

     

     

     

     

    12 # 动态库应用示范程序

    12 # 动态库应用示范程序

     

     

     

     

    13 dy : $(DYTGT)

    13 dy : $(DYTGT)

     

     

     

     

    14 cc -rdynamic -s -o [email protected] $(DYTGT) -ldl

    14 cc -rdynamic -s -o $@ $(DYTGT) -ldl

     

     

     

     

    15

    15

     

     

     

     

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

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

     

     

     

     

    维护文件说明:

    维护文件说明:

     

     

     

     

    第3行: 定义所有需要维护的模块;

    第3行: 定义所有需要维护的模块;

     

     

     

     

    第5行: 定义源程序;

    第5行: 定义源程序;

     

     

     

     

    第7行: 定义目标文件;

    第7行: 定义目标文件;

     

     

     

     

    第9-10行: 定义.o文件依赖于.c文件,维护代码为“cc -c 变动的源文件名”;

    第9-10行: 定义.o文件依赖于.c文件,维护代码为“cc -c 变动的源文件名”;

     

     

     

     

    第13-14行: 定义dy依赖于变量DYTGT指示的值,维护代码中采用-rdynamic选项以指定输出文件为动态链接的方式,选项-s指定删除目标文件中的符号表,最后的选项-ldl则指示装配程序ld需要装载dl函数库。

    第13-14行: 定义dy依赖于变量DYTGT指示的值,维护代码中采用-rdynamic选项以指定输出文件为动态链接的方式,选项-s指定删除目标文件中的符号表,最后的选项-ldl则指示装配程序ld需要装载dl函数库。

     

     

     

     

    2.2.3运行make命令

    2.2.3运行make命令

     

     

     

     

    运行make后将产生执行文件dy,运行后将产生如下类似信息:

    运行make后将产生执行文件dy,运行后将产生如下类似信息:

     

     

     

     

    动态链接库应用示范

    动态链接库应用示范

     

     

     

     

    当前日期: 2001-06-28

    当前日期: 2001-06-28

     

     

     

     

    当前时间: 10:06:21

    当前时间: 10:06:21

     

     

     

     

    当删除my.so文件时,将出现以下信息:

    当删除my.so文件时,将出现以下信息:

     

     

     

     

    动态链接库应用示范

    动态链接库应用示范

     

     

     

     

    my.so: cannot open shared object file: 文件或目录不存在

    my.so: cannot open shared object file: 文件或目录不存在

     

     

     

     

    3、小结

    3、小结

     

     

     

     

    LINUX创建与使用动态链接库并不是一件难事。

    LINUX创建与使用动态链接库并不是一件难事。

     

     

     

     

    编译函数源程序时选用-shared选项即可创建动态链接库,注意应以.so后缀命名,最好放到公用库目录(如/lib,/usr/lib等)下面,并要写好用户接口文件,以便其它用户共享。

    编译函数源程序时选用-shared选项即可创建动态链接库,注意应以.so后缀命名,最好放到公用库目录(如/lib,/usr/lib等)下面,并要写好用户接口文件,以便其它用户共享。

     

     

     

     

    使用动态链接库,源程序中要包含dlfcn.h头文件,写程序时注意dlopen等函数的正确调用,编译时要采用-rdynamic选项与-ldl选项,以产生可调用动态链接库的执行代码。

    使用动态链接库,源程序中要包含dlfcn.h头文件,写程序时注意dlopen等函数的正确调用,编译时要采用-rdynamic选项与-ldl选项,以产生可调用动态链接库的执行代码。

     

     

     

     

     

     

    二,LINUX动态链接库高端应用

    二,LINUX动态链接库高等应用

     

     

    在《LINUX下动态链接库的创始与使用》一文中,笔者介绍了LINUX动态链接库的大旨知识.其要点是:用户依照实际景况须要,利用dlopen,dlsym,dlclose等动态链接库操作函数,装入钦点的动态链接库中内定的函数,然后加以试行.程序中选取不多的动态函数时,那样的做法仍可以.借使程序供给调用大批量的动态函数,那么选择那样的编制程序手腕将是极度复杂的,所以大家亟须运用一种特别聪明的办法,以压缩代码量,进步级程序员作效用.那正是现行反革命本身要比如介绍的《LINUX动态链接库高端应用》.

    在《LINUX下动态链接库的创始与运用》一文中,小编介绍了LINUX动态链接库的宗旨知识.其要点是:用户根据实情须要,利用dlopen,dlsym,dlclose等动态链接库操作函数,装入钦点的动态链接库中钦定的函数,然后加以实行.程序中利用相当少的动态函数时,那样的做法尚可.如果程序供给调用大批量的动态函数,那么选择那样的编程招数将是丰盛复杂的,所以我们无法不利用一种越发聪明的主意,以缩减代码量,提升级程序员作效用.那就是前几日本身要举例介绍的《LINUX动态链接库高档应用》.

    注:本文举的例证类似上篇文章,只是文件的内容已做相应修改,收缩了过多.示例程序ady.c和四个动态函数的源程序getdate.c与gettime.c仅修改了头文件的名字,其情节不再列出.本文使用头文件为adatetime.h.

    注:本文举的例证类似上篇小说,只是文件的内容已做相应修改,减弱了重重.示例程序ady.c和八个动态函数的源程序getdate.c与gettime.c仅修改了头文件的名字,其剧情不再列出.本文使用头文件为adatetime.h.

    要想急迅地接纳LINUX动态链接库(越发是用户自个儿编排的),供给做以下工作:

    要想急迅地应用LINUX动态链接库(尤其是用户自身编排的),须求做以下专门的学业:

    一、编写合格的动态链接库头文件

    一、编写合格的动态链接库头文件

    C语言的头文件,可供三个或七个程序引用,里面一般定义程序所需的常量,自定义类型及函数原型表明等.当中的函数原型表达,则供编写翻译器检查语法,用于破除引用参数时类型不雷同的错误.只有编写制定合格的动态链接库头文件,技术员工夫科学使用动态链接库内的函数.

    C语言的头文件,可供三个或四个程序引用,里面一般定义程序所需的常量,自定义类型及函数原型表达等.在那之中的函数原型说明,则供编译器检查语法,用于破除引用参数时类型不平等的错误.只有编写制定合格的动态链接库头文件,程序猿技艺科学行使动态链接库内的函数.

    动态链接库头文件要使用C语言标准格式,当中的动态函数原型定义,不必象上文介绍的那么用(*动态函数名)的叙说格局.请看上面包车型大巴事例:(每行开始的数字为所在行行号,为作者增多,供阐明使用)

    动态链接库头文件要接纳C语言标准格式,在那之中的动态函数原型定义,不必象上文介绍的那样用(*动态函数名)的叙述方式.请看上边包车型客车例证:(每行起始的数字为所在行行号,为作者增多,供注解使用)

    1 /* adatetime.h : 驰骋软件制作大旨雨亦奇([email protected])编写, 2002-03-06. */ 

    3 #ifndef __DATETIME_H 

    5 #define __DATETIME_H 

    7 /* 日期结构*/ 
    8 typedef struct 
    9 { 
    10 int year; 
    11 int mon; 
    12 int day; 
    13 }DATETYPE; 
    14 
    15 /* 时间结构*/ 
    16 typedef struct 
    17 { 
    18 char hour; 
    19 char min; 
    20 char sec; 
    21 }TIMETYPE; 
    22 
    23 int getdate(DATETYPE *d); /* 取当昨日期*/ 
    24 int gettime(TIMETYPE *t); /* 取当前时光*/ 
    25 
    26 #endif 
    27

    1 /* adatetime.h : 驰骋软件制作中央雨亦奇(zhsoft@371.net)编写, 二〇〇一-03-06. */ 

    3 #ifndef __DATETIME_H 

    5 #define __DATETIME_H 

    7 /* 日期结构*/ 
    8 typedef struct 
    9 { 
    10 int year; 
    11 int mon; 
    12 int day; 
    13 }DATETYPE; 
    14 
    15 /* 时间结构*/ 
    16 typedef struct 
    17 { 
    18 char hour; 
    19 char min; 
    20 char sec; 
    21 }TIMETYPE; 
    22 
    23 int getdate(DATETYPE *d); /* 取当今天期*/ 
    24 int gettime(TIMETYPE *t); /* 取当前时刻*/ 
    25 
    26 #endif 
    27

    注:与上文的datetime.h文件比较,从该头文件第23,24行能够见到,动态函数getdate,gettime的原型定义改换了,不再利用(*getdate),(*gettime)的格式了(这种格式使用相比罗嗦).

    注:与上文的datetime.h文件比较,从该头文件第23,24行能够看出,动态函数getdate,gettime的原型定义更改了,不再动用(*getdate),(*gettime)的格式了(这种格式使用较为罗嗦).

    二、正确编写翻译与命名动态链接库

    二、正确编写翻译与命名动态链接库

    为了让GCC编写翻译器生成动态链接库,编译时须加选项-shared.(那点须记取)

    为了让GCC编写翻译器生成动态链接库,编译时须加选项-shared.(那一点须切记)

    LINUX系统中,为了让动态链接库能被系统中其它程序共享,其名字应顺应“lib*.so*”这种格式.假设有些动态链接库不适合此格式,则LINUX的动态链接库自动装入程序(ld.so)将追寻不到此链接库,其它程序也无从共享之.

    LINUX系统中,为了让动态链接库能被系统中任何程序共享,其名字应符合“lib*.so*”这种格式.假使有个别动态链接库不符合此格式,则LINUX的动态链接库自动装入程序(ld.so)将追寻不到此链接库,别的程序也无从共享之.

    格式中,第一个*常见表示为简写的库名,第贰个*普通表示为该库的本子号.如:在自己的系统中,基本C动态链接库的名称叫libc.so.6,线程pthread动态链接库的名称叫libpthread.so.0等等.本文例子所生成的动态链接库的名称为libmy.so,虽未有版本号,但也适合所需要的格式.

    格式中,第一个*平凡表示为简写的库名,第一个*普普通通表示为该库的版本号.如:在自己的种类中,基本C动态链接库的名叫libc.so.6,线程pthread动态链接库的名称为libpthread.so.0等等.本文例子所生成的动态链接库的名为libmy.so,虽尚未版本号,但也符合所供给的格式.

    浮动该动态链接库的保证文件makefile-lib内容如下:

    扭转该动态链接库的掩护文件makefile-lib内容如下:

    1 # makefile : 纵横软件制作大旨雨亦奇编写, 二零零一-03-07. 

    3 all : libmy.so 

    5 SRC = getdate.c gettime.c 

    7 TGT = $(SRC:.c=.o) 

    9 $(SRC) : adatetime.h 
    10 @touch [email protected] 
    11 
    12 %.o : %.c 
    13 cc -c $? 
    14 
    15 # 动态链接库(libmy.so)生成 
    16 libmy.so : $(TGT) 
    17 cc -s -shared -o [email protected] $(TGT) 
    18

    1 # makefile : 驰骋软件制作中央雨亦奇编写, 二零零二-03-07. 

    3 all : libmy.so 

    5 SRC = getdate.c gettime.c 

    7 TGT = $(SRC:.c=.o) 

    9 $(SRC) : adatetime.h 
    10 @touch $@ 
    11 
    12 %.o : %.c 
    13 cc -c $? 
    14 
    15 # 动态链接库(libmy.so)生成 
    16 libmy.so : $(TGT) 
    17 cc -s -shared -o $@ $(TGT) 
    18

    运营命令:

    运行命令:

    $ make -f makefile-lib 
    $

    $ make -f makefile-lib 
    $

    即生成libmy.so库.

    即生成libmy.so库.

    注: 维护文件中,第17行用-shared选项以生成动态链接库,用-s选项以去掉目的文件中的符号表,从而减小文件长度.

    注: 维护文件中,第17行用-shared选项以生成动态链接库,用-s选项以去掉目的文件中的符号表,从而减小文件长度.

    三、共享动态链接库

    三、共享动态链接库

    3.1 动态链接库配置文件

    3.1 动态链接库配置文件

    为了让动态链接库为系统所使用,须要爱戴动态链接库的配置文件--/etc/ld.so.conf.此文件内,存放着可被LINUX共享的动态链接库所在目录的名字(系统目录/lib,/usr/lib除却),各样目录名间以空白字符(空格,换行等)或冒号或逗号分隔.一般的LINUX发行版中,此文件均含三个共享目录/usr/X11本田UR-V6/lib,为X window窗口系统的动态链接库所在的目录.

    为了让动态链接库为系统所接纳,需求珍重动态链接库的配置文件--/etc/ld.so.conf.此文件内,存放着可被LINUX共享的动态链接库所在目录的名字(系统目录/lib,/usr/lib除了那些之外),各类目录名间以空白字符(空格,换行等)或冒号或逗号分隔.一般的LINUX发行版中,此文件均含四个共享目录/usr/X11奥迪Q76/lib,为X window窗口系统的动态链接库所在的目录.

    上边看看本人的系统中此文件的剧情如何:

    上边看看自身的系统中此文件的故事情节什么:

    # cat /etc/ld.so.conf 
    /usr/X11R6/lib 
    /usr/zzz/lib 
    #

    # cat /etc/ld.so.conf 
    /usr/X11R6/lib 
    /usr/zzz/lib 
    #

    由上能够见到,该动态库配置文件中,扩张了二个/usr/zzz/lib目录.那是本人本身新建的共享库目录,上面存放小编新开垦的可供系统共享的动态链接库.

    由上得以见到,该动态库配置文件中,扩大了一个/usr/zzz/lib目录.这是自身要好新建的共享库目录,上边存放作者新开垦的可供系统共享的动态链接库.

    3.2 动态链接库管理命令

    3.2 动态链接库管理命令

    为了让动态链接库为系统所共享,还需运转动态链接库的治本命令--ldconfig.此实施顺序存放在/sbin目录下.

    为了让动态链接库为系统所共享,还需运转动态链接库的管制命令--ldconfig.此施行顺序存放在/sbin目录下.

    ldconfig命令的用处,首假设在默许搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创造出动态装入程序(ld.so)所需的总是和缓存文件.缓存文件默以为/etc/ld.so.cache,此文件保留已排好序的动态链接库名字列表.

    ldconfig命令的用处,首假如在私下认可搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,寻找出可共享的动态链接库(格式如前介绍,lib*.so*),进而成立出动态装入程序(ld.so)所需的总是和缓存文件.缓存文件默以为/etc/ld.so.cache,此文件保留已排好序的动态链接库名字列表.

    ldconfig经常在系统运行时运转,而当用户安装了八个新的动态链接库时,就要求手工业运营这么些命令.

    ldconfig常常在系统运维时运营,而当用户设置了多个新的动态链接库时,就须要手工业运维这几个命令.

    ldconfig命令行用法如下:

    ldconfig命令行用法如下:

    ldconfig [-v|--verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|--print-cache] [-c FORMAT] [--format=FORMAT] [-V] [-?|--help|--usage] path...

    ldconfig [-v|--verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|--print-cache] [-c FORMAT] [--format=FORMAT] [-V] [-?|--help|--usage] path...

    ldconfig可用的选择表明如下:

    ldconfig可用的挑三拣四表明如下:

    (1) -v或--verbose : 用此选项时,ldconfig将显得正在扫描的目录及寻找到的动态链接库,还恐怕有它所创设的连日的名字.

    (1) -v或--verbose : 用此选项时,ldconfig将显得正在扫描的目录及搜寻到的动态链接库,还或然有它所开创的连天的名字.

    (2) -n : 用此选项时,ldconfig仅扫描命令行钦赐的目录,不扫描私下认可目录(/lib,/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录.

    (2) -n : 用此选项时,ldconfig仅扫描命令行内定的目录,不扫描暗许目录(/lib,/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录.

    (3) -N : 此选项提醒ldconfig不重建缓存文件(/etc/ld.so.cache).若未用-X选项,ldconfig照常更新文件的连接.

    (3) -N : 此选项提醒ldconfig不重建缓存文件(/etc/ld.so.cache).若未用-X选项,ldconfig照常更新文件的连接.

    (4) -X : 此选项提醒ldconfig不创新文件的连接.若未用-N选项,则缓存文件不奇怪更新.

    (4) -X : 此选项提醒ldconfig不更新文件的连接.若未用-N选项,则缓存文件不奇怪更新.

    (5) -f CONF : 此选项钦赐动态链接库的铺排文件为CONF,系统默认为/etc/ld.so.conf.

    (5) -f CONF : 此选项钦定动态链接库的配置文件为CONF,系统暗中认可为/etc/ld.so.conf.

    (6) -C CACHE : 此选项钦点生成的缓存文件为CACHE,系统默许的是/etc/ld.so.cache,此文件存放已排好序的可共享的动态链接库的列表.

    (6) -C CACHE : 此选项钦定生成的缓存文件为CACHE,系统暗中认可的是/etc/ld.so.cache,此文件存放已排好序的可共享的动态链接库的列表.

    (7) -r ROOT : 此选项退换应用程序的根目录为ROOT(是调用chroot函数实现的).选取此项时,系统暗许的安顿文件/etc/ld.so.conf,实际对应的为ROOT/etc/ld.so.conf.如用-r /usr/zzz时,打开配置文件/etc/ld.so.conf时,实际展开的是/usr/zzz/etc/ld.so.conf文件.用此选项,能够大大扩大动态链接库管理的灵巧性.

    (7) -r ROOT : 此选项改动应用程序的根目录为ROOT(是调用chroot函数达成的).采取此项时,系统暗许的配备文件/etc/ld.so.conf,实际对应的为ROOT/etc/ld.so.conf.如用-r /usr/zzz时,张开配置文件/etc/ld.so.conf时,实际张开的是/usr/zzz/etc/ld.so.conf文件.用此选项,能够大大扩充动态链接库管理的灵敏性.

    (8) -l : 平日状态下,ldconfig寻找动态链接库时将活动创立动态链接库的连接.选取此项时,将跻身专家格局,要求手工业安装连接.一般用户不用此项.

    (8) -l : 常常状态下,ldconfig搜索动态链接库时将自动建设构造动态链接库的连接.采取此项时,将进入专家格局,供给手工业安装连接.一般用户毫无此项.

    (9) -p或--print-cache : 此选项提示ldconfig打字与印刷出当下缓存文件所保存的全数共享库的名字.

    (9) -p或--print-cache : 此选项提醒ldconfig打印出近日缓存文件所保存的持有共享库的名字.

    (10) -c FORMAT 或--format=FORMAT : 此选项用于钦定缓存文件所选拔的格式,共有三种:old(老格式),new(新格式)和compat(兼容格式,此为暗许格式).

    (10) -c FORMAT 或--format=FORMAT : 此选项用于钦点缓存文件所选择的格式,共有三种:old(老格式),new(新格式)和compat(包容格式,此为默许格式).

    (11) -V : 此选项打字与印刷出ldconfig的版本音信,而后退出.

    (11) -V : 此选项打字与印刷出ldconfig的版本消息,而后退出.

    (12) -? 或--help 或--usage : 这八个挑选成效同样,都以让ldconfig打字与印刷出其帮忙音信,而后退出.

    (12) -? 或--help 或--usage : 那多个采用功用相同,都以让ldconfig打字与印刷出其援救消息,而后退出.

    举三个例子:

    举八个例子:

    例1:

    例1:

    # ldconfig -p 
    793 libs found in cache `/etc/ld.so.cache' 
    libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2 
    libzvt.so (libc6) => /usr/lib/libzvt.so 
    libz.so.1.1.3 (libc6) => /usr/lib/libz.so.1.1.3 
    libz.so.1 (libc6) => /lib/libz.so.1 
    ...... 
    #

    # ldconfig -p 
    793 libs found in cache `/etc/ld.so.cache' 
    libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2 
    libzvt.so (libc6) => /usr/lib/libzvt.so 
    libz.so.1.1.3 (libc6) => /usr/lib/libz.so.1.1.3 
    libz.so.1 (libc6) => /lib/libz.so.1 
    ...... 
    #

    注: 一时候用户想驾驭系统中有怎么着动态链接库,也许想知道系统中有未有某些动态链接库,那时,可用-p选项让ldconfig输出缓存文件中的动态链接库列表,从而查询获得.例子中,ldconfig命令的出口结果第1行申明在缓存文件/etc/ld.so.cache中找到7玖拾叁个共享库,第2行起首正是一多种共享库的名字及其全名(绝对路径).因为实际出口结果太多,为节约篇幅,以......表示省略的部分.

    注: 一时候用户想知道系统中有如何动态链接库,可能想知道系统中有未有有些动态链接库,那时,可用-p选项让ldconfig输出缓存文件中的动态链接库列表,从而查询得到.例子中,ldconfig命令的出口结果第1行表明在缓存文件/etc/ld.so.cache中找到792个共享库,第2行早先就是一雨后冬笋共享库的名字及其全名(相对路径).因为其实出口结果太多,为节约篇幅,以......表示省略的部分.

    例2:

    例2:

    # ldconfig -v 
    /lib: 
    liby.so.1 -> liby.so.1 
    libnss_wins.so -> libnss_wins.so 
    ...... 
    /usr/lib: 
    libjscript.so.2 -> libjscript.so.2.0.0 
    libkspell.so.2 -> libkspell.so.2.0.0 
    ...... 
    /usr/X11R6/lib: 
    libmej-0.8.10.so -> libmej-0.8.10.so 
    libXaw3d.so.7 -> libXaw3d.so.7.0 
    ...... 
    #

    # ldconfig -v 
    /lib: 
    liby.so.1 -> liby.so.1 
    libnss_wins.so -> libnss_wins.so 
    ...... 
    /usr/lib: 
    libjscript.so.2 -> libjscript.so.2.0.0 
    libkspell.so.2 -> libkspell.so.2.0.0 
    ...... 
    /usr/X11R6/lib: 
    libmej-0.8.10.so -> libmej-0.8.10.so 
    libXaw3d.so.7 -> libXaw3d.so.7.0 
    ...... 
    #

    注: ldconfig命令在运作平常化的情事下,默许不出口什么东西.本例中用了-v选项,以使ldconfig在运维时输出正在扫描的目录及追寻到的共享库,用户能够知晓地见到运维的结果.施行达成后,ldconfig将刷新缓存文件/etc/ld.so.cache.

    注: ldconfig命令在运作符合规律化的意况下,暗中认可不出口什么东西.本例中用了-v选项,以使ldconfig在运维时输出正在扫描的目录及搜索到的共享库,用户能够领略地来看运营的结果.实施达成后,ldconfig将刷新缓存文件/etc/ld.so.cache.

    例3:

    例3:

    # ldconfig /usr/zhsoft/lib 
    #

    # ldconfig /usr/zhsoft/lib 
    #

    注: 当用户在某些目录上边创立或拷贝了三个动态链接库,若想使其被系统共享,能够实践一下"ldconfig 目录名"这一个命令.此命令的职能在于让ldconfig将点名目录下的动态链接库被系统共享起来,意即:在缓存文件/etc/ld.so.cache中加进进钦赐目录下的共享库.本例让系统共享了/usr/zhsoft/lib目录下的动态链接库.要求注解的是,假诺此目录不在/lib,/usr/lib及/etc/ld.so.conf文件所列的目录里面,则再度运维ldconfig时,此目录下的动态链接库恐怕不被系统共享了. 
    3.3 动态链接库怎样共享

    注: 当用户在有些目录上边创立或拷贝了四个动态链接库,若想使其被系统共享,能够实践一下"ldconfig 目录名"那些命令.此命令的听从在于让ldconfig将点名目录下的动态链接库被系统共享起来,意即:在缓存文件/etc/ld.so.cache中追加进内定目录下的共享库.本例让系统共享了/usr/zhsoft/lib目录下的动态链接库.要求注明的是,若是此目录不在/lib,/usr/lib及/etc/ld.so.conf文件所列的目录里面,则再度运转ldconfig时,此目录下的动态链接库或然不被系统共享了. 
    3.3 动态链接库如何共享

    了然了以上文化,大家得以选择以下二种格局来共享动态链接库:(注:均须在一级用户意况下操作,以自家的动态链接库libmy.so共享进程为例)

    摸底了上述文化,大家能够动用以下三种艺术来共享动态链接库:(注:均须在最好用户意况下操作,以本身的动态链接库libmy.so共享进程为例)

    (1)拷贝动态链接库到系统共享目录下,或在系统共享目录下为该动态链接库创设个接二连三(硬连接或标记连接均可,常用符号连接).这里说的连串共享目录,指的是LINUX动态链接仓库储存放的目录,它包涵/lib,/usr/lib以及/etc/ld.so.conf文件内所列的一类别目录.

    (1)拷贝动态链接库到系统共享目录下,或在系统共享目录下为该动态链接库创建个再三再四(硬连接或标记连接均可,常用符号连接).这里说的种类共享目录,指的是LINUX动态链接仓库储存放的目录,它富含/lib,/usr/lib以及/etc/ld.so.conf文件内所列的一文山会海目录.

    # cp libmy.so /lib 
    # ldconfig 
    #

    # cp libmy.so /lib 
    # ldconfig 
    #

    或:

    或:

    # ln -s `pwd`/libmy.so /lib 
    # ldconfig 
    #

    # ln -s `pwd`/libmy.so /lib 
    # ldconfig 
    #

    (2)将动态链接库所在目录名追加到动态链接库配置文件/etc/ld.so.conf中.

    (2)将动态链接库所在目录名追加到动态链接库配置文件/etc/ld.so.conf中.

    # pwd >> /etc/ld.so.conf 
    # ldconfig 
    #

    # pwd >> /etc/ld.so.conf 
    # ldconfig 
    #

    (3)利用动态链接库管理命令ldconfig,强制其招来钦命目录,并立异缓存文件,便于动态装入.

    (3)利用动态链接库管理命令ldconfig,强制其寻觅内定目录,并立异缓存文件,便于动态装入.

    # ldconfig `pwd` 
    #

    # ldconfig `pwd` 
    #

    亟需注明的是,这种操作方法即便平价,但功效是一时的,供程序测试还能,一旦再一次运转ldconfig,则缓存文件内容恐怕更动,所需的动态链接库只怕不被系统共享了.与之绝相比,前三种办法是牢靠的办法,值得业已定型的动态链接库共享时选取.前二种艺术还应该有一个表征,即最终一条命令都以ldconfig,也即均需求更新一下缓存文件,以管教动态链接库的共享生效.

    急需证实的是,这种操作方法就算平价,但作用是一时的,供程序测试还能,一旦再度运转ldconfig,则缓存文件内容可能退换,所需的动态链接库也许不被系统共享了.与之绝比较,前二种办法是牢靠的措施,值得业已定型的动态链接库共享时接纳.前三种方式还应该有贰个特色,即最终一条命令都以ldconfig,也即均必要更新一下缓存文件,以保险动态链接库的共享生效.

    四、含有动态函数的顺序的编写翻译

    四、含有动态函数的次序的编写翻译

    4.1 幸免编写翻译因未钦赐动态链接库而失误

    4.1 幸免编写翻译因未钦定动态链接库而失误

    当一个顺序接纳动态函数时,编写翻译该程序时就无法不钦赐含所用动态函数的动态链接库,不然编译将会出错退出.如本文示例程序ady.c的编写翻译(未鲜明引用动态链接库libmy.so):

    当三个程序行使动态函数时,编写翻译该程序时就必须指定含所用动态函数的动态链接库,不然编写翻译将会出错退出.如本文示例程序ady.c的编写翻译(未明朗引用动态链接库libmy.so):

    # cc -o ady ady.c 
    /tmp/ccL4FsJp.o: In function `main': 
    /tmp/ccL4FsJp.o(.text 0x43): undefined reference to `gettime' 
    collect2: ld returned 1 exit status 
    #

    # cc -o ady ady.c 
    /tmp/ccL4FsJp.o: In function `main': 
    /tmp/ccL4FsJp.o(.text 0x43): undefined reference to `gettime' 
    collect2: ld returned 1 exit status 
    #

    注: 因为ady.c所含的动态函数getdate,gettime不在系统函数库中,所以接二连三时出错.

    注: 因为ady.c所含的动态函数getdate,gettime不在系统函数库中,所以一连时出错.

    4.2 编写翻译时引用动态链接库的两种办法

    4.2 编写翻译时引用动态链接库的几种情势

    (1)当所用的动态链接库在系统目录(/lib,/usr/lib)下时,可用编写翻译选项-l来引用.即:

    (1)当所用的动态链接库在系统目录(/lib,/usr/lib)下时,可用编写翻译选项-l来引用.即:

    # cc -lmy -o ady ady.c 
    #

    # cc -lmy -o ady ady.c 
    #

    注:编写翻译时用-l选项引用动态链接库时,库名须使用其缩写方式.本例的my,表示援引libmy.so库.若引用光标库libncurses.so,须用-lncurses.注意,-l选项与参数之间不能够有空格,不然会出错.

    注:编写翻译时用-l选项引用动态链接库时,库名须使用其缩写方式.本例的my,表示援引libmy.so库.若引用光标库libncurses.so,须用-lncurses.注意,-l选项与参数之间不可能有空格,不然会出错.

    (2)当所用的动态链接库在系统目录(/lib,/usr/lib)以外的目录时,须用编写翻译选项-L来钦定动态链接库所在的目录(供编写翻译器查找用),相同的时候用-l选项钦赐缩写的动态链接库名.即:

    (2)当所用的动态链接库在系统目录(/lib,/usr/lib)以外的目录时,须用编写翻译选项-L来钦定动态链接库所在的目录(供编译器查找用),同一时间用-l选项内定缩写的动态链接库名.即:

    # cc -L/usr/zzz/lib -lmy -o ady ady.c 
    #

    # cc -L/usr/zzz/lib -lmy -o ady ady.c 
    #

    (3)直接引用所需的动态链接库.即:

    (3)直接引用所需的动态链接库.即:

    # cc -o ady ady.c libmy.so 
    #

    # cc -o ady ady.c libmy.so 
    #

    # cc -o ady ady.c /lib/libmy.so 
    #

    # cc -o ady ady.c /lib/libmy.so 
    #

    等等.在这之中,动态链接库的库名能够动用绝对路线格局(文件名不以/开始),也可应用相对路线情势(文件名以/先导).

    等等.其中,动态链接库的库名能够选取相对路线情势(文件名不以/初始),也可应用相对路线情势(文件名以/开首).

    五、动态链接程序的运营与检查

    五、动态链接程序的周转与自己争辨

    5.1 运行

    5.1 运行

    编写翻译连接好含动态函数的先后后,就能够运作它了.动态链接程序因为共享了系统中的动态链接库,所以其空间攻陷非常小.但那并不意味着效能的缩减,它的实施与静态连接的程序实施,效果完全同样.在命令提醒符下键入程序名及相关参数后回车就能够,如下例:

    编写翻译连接好含动态函数的顺序后,就可以运转它了.动态链接程序因为共享了系统中的动态链接库,所以其空间攻克非常小.但那并不代表功能的减少,它的推行与静态连接的程序推行,效果完全同样.在指令提醒符下键入程序名及相关参数后回车就能够,如下例:

    $ ady 
    动态链接库高等应用示范 
    当下日子: 二〇〇一-03-11 
    此时此刻时光: 19:39:06 
    $

    $ ady 
    动态链接库高端应用示范 
    当前天子: 二零零四-03-11 
    脚下岁月: 19:39:06 
    $

    5.2 检查

    5.2 检查

    检查什么?检查动态链接程序毕竟需求什么样共享库,系统中是或不是已有这一个库,未有的话,用户好想艺术把这几个库装上.

    检查什么?检查动态链接程序毕竟供给如何共享库,系统中是或不是已有那几个库,未有的话,用户好想方法把那一个库装上.

    怎么检查呢?这里,告诉您二个实用程序--ldd,那么些顺序就是极其用来检查动态链接程序正视哪些共享库的.

    怎么检查呢?这里,告诉你三个实用程序--ldd,那几个顺序便是专门用来检查动态链接程序注重哪些共享库的.

    ldd命令行用法如下:

    ldd命令行用法如下:

    ldd [--version] [-v|--verbose] [-d|--data-relocs] [-r|--function-relocs] [--help] FILE...

    ldd [--version] [-v|--verbose] [-d|--data-relocs] [-r|--function-relocs] [--help] FILE...

    各采纳表达如下:

    各选项表明如下:

    (1) --version : 此选项用于打字与印刷出ldd的本子号.

    (1) --version : 此选项用于打字与印刷出ldd的版本号.

    (2) -v 或--verbose : 此选项提示ldd输出关于所依附的动态链接库的尽量详细的音信.

    (2) -v 或--verbose : 此选项提醒ldd输出关于所依赖的动态链接库的玩命详细的音信.

    (3) -d 或--data-relocs : 此选项实施重平昔,并且显示不设有的函数.

    (3) -d 或--data-relocs : 此选项施行重向来,并且显示不设有的函数.

    (4) -r 或--function-relocs : 此选项施行多少对象与函数的重定位,相同的时间报告不设有的对象.

    (4) -r 或--function-relocs : 此选项实施多少对象与函数的重定位,同一时间报告不设有的对象.

    (5) --help : 此选项用于打字与印刷出ldd的扶植音信.

    (5) --help : 此选项用于打字与印刷出ldd的帮带消息.

    注: 上述选项中,常用-v(或--verbose)选项.

    注: 上述选项中,常用-v(或--verbose)选项.

    ldd的命令行参数为FILE...,即一个或多个文本名(动态链接程序或动态链接库).

    ldd的命令行参数为FILE...,即一个或七个公文名(动态链接程序或动态链接库).

    例1:

    例1:

    $ ldd ady 
    libmy.so => ./libmy.so (0x40026000) 
    libc.so.6 => /lib/libc.so.6 (0x40028000) 
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 
    $

    $ ldd ady 
    libmy.so => ./libmy.so (0x40026000) 
    libc.so.6 => /lib/libc.so.6 (0x40028000) 
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 
    $

    注: 每行=>前边的,为动态链接程序所需的动态链接库的名字,而=>后面包车型地铁,则是运转时系统实际调用的动态链接库的名字,所需的动态链接库在系统中不存在时,=>后边将显得"not found",括号所括的数字为虚拟的实行地址.本例列出ady所需的多个动态链接库,个中libmy.so为自个儿新建的动态链接库,而libc.so.6与/lib/ld-linux.so.2均为系统的动态链接库,前四个为主干C库,后五个动态装入库(用于动态链接库的装入及运转).

    注: 每行=>前面包车型大巴,为动态链接程序所需的动态链接库的名字,而=>前边的,则是运营时系统实际调用的动态链接库的名字,所需的动态链接库在系统中不设有时,=>后边将显得"not found",括号所括的数字为虚拟的实践地址.本例列出ady所需的四个动态链接库,个中libmy.so为本人新建的动态链接库,而libc.so.6与/lib/ld-linux.so.2均为系统的动态链接库,前二个为着力C库,后多少个动态装入库(用于动态链接库的装入及运营).

    例2:

    例2:

    $ ldd -v ady 
    libmy.so => ./libmy.so (0x40026000) 
    libc.so.6 => /lib/libc.so.6 (0x40028000) 
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

    $ ldd -v ady 
    libmy.so => ./libmy.so (0x40026000) 
    libc.so.6 => /lib/libc.so.6 (0x40028000) 
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

    Version information: 
    ./ady: 
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6 
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6 
    ./libmy.so: 
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6 
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6 
    /lib/libc.so.6: 
    ld-linux.so.2 (GLIBC_2.1.1) => /lib/ld-linux.so.2 
    ld-linux.so.2 (GLIBC_2.2.3) => /lib/ld-linux.so.2 
    ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2 
    ld-linux.so.2 (GLIBC_2.2) => /lib/ld-linux.so.2 
    ld-linux.so.2 (GLIBC_2.0) => /lib/ld-linux.so.2 
    $

    Version information: 
    ./ady: 
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6 
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6 
    ./libmy.so: 
    libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6 
    libc.so.6 (GLIBC_2.0) => /lib/libc.so.6 
    /lib/libc.so.6: 
    ld-linux.so.2 (GLIBC_2.1.1) => /lib/ld-linux.so.2 
    ld-linux.so.2 (GLIBC_2.2.3) => /lib/ld-linux.so.2 
    ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2 
    ld-linux.so.2 (GLIBC_2.2) => /lib/ld-linux.so.2 
    ld-linux.so.2 (GLIBC_2.0) => /lib/ld-linux.so.2 
    $

    注:本例用-v选项以呈现尽只怕多的音讯,所以例中除列出ady所供给的动态链接库外,还列出了程序所需动态链接库版本方面包车型的士音信.

    注:本例用-v选项以显示尽大概多的音信,所以例中除列出ady所必要的动态链接库外,还列出了先后所需动态链接库版本方面包车型大巴音讯.

    小结: 在LINUX动态链接库的尖端应用中,关键有两点,一是怎么让动态链接库为LINUX系统所共享,二是编译连接程序时如何是好.让动态链接库为系统所共享,首若是用ldconfig管理命令,维护好系统共享库的缓存文件/etc/ld.so.cache.编译连接时怎么办?注意连接上所用的动态链接库就足以了.LINUX动态链接库的尖端应用,用一用就精通:其实,就是这样轻易!

    计算: 在LINUX动态链接库的高端应用中,关键有两点,一是怎么着让动态链接库为LINUX系统所共享,二是编写翻译连接程序时怎么做.让动态链接库为系统所共享,首假如用ldconfig管理命令,维护好系统共享库的缓存文件/etc/ld.so.cache.编写翻译连接时咋做?注意连接上所用的动态链接库就能够了.LINUX动态链接库的尖端应用,用一用就知晓:其实,正是那般简单!

    LINUX 系统中动态链接库的创导与使用 大家都精晓,在WINDOWS系统中有无数的动态链接库(以.DLL为后缀的文本,DLL即Dynamic Link Library)。这...

    本文由新葡亰496net发布于服务器网络,转载请注明出处:LINUX动态链接库的创建与使用,linux动态链接库

    关键词: