首页 娱乐 农业 辩论 泰山 社会 民生 热门 头条 新闻

军事

旗下栏目:

静态链接库和动态链接库 | 学步园

来源:网络整理 作者:admin 人气: 发布时间:2019-03-18
摘要:

      库,这是一种包装机制。,复杂被期望把所局部源选定的遗传密码编制成目的选定的遗传密码后打成的包.库的开发者应用程式除非装备库的目的选定的遗传密码外,它还装备了跟踪的头用纸覆盖。,头用纸覆盖组编库的管嘴。,对立面的况且一点点不能废除的的的正文.集中应变量地基无论被编制到顺序内部的而分为动态链接库(static)和动态链接库(dynamic).

      立刻,库是一组应变量。,或.o用纸覆盖的集中.链接器(LD)用于将用户本身的.o用纸覆盖与集中应变量链接有工作的.

一、动态链接库(动态应变量库)
     拉长说名这种应变量通常类似地拉长说。 -->"lib"、必需品添加A。,中枢的XXX表现体育馆的著名的。
编制行动顺序应用时,动态应变量库说话中肯拿档案将被集成到处决顺序中。,动态应变量库将被添加到可处决用纸覆盖中。,因而,应用动态应变量库创作的可处决用纸覆盖会构成大一点点.
传令嘉奖一则组编源用纸覆盖。,编制动态应变量库时,,零碎将源用纸覆盖和动态应变量库放有工作的。,那么创作无论哪些人可处决用纸覆盖。
孤独处决使适应动态应变量库的最大独特的是,编制后的可处决用纸覆盖可以孤独运转。,不喜欢再向表面缺少读取应变量库的物质(鉴于应变量库的物质先前跟随源用纸覆盖一齐编制成了可处决用纸覆盖).
晋级困难动态应变量库最大的缺陷是U很难实现预期的结果。,还必需品将源用纸覆盖和晋级后的应变量库举行重行编制.很才能获得晋级后的可处决用纸覆盖,因而手术构成麻烦的。
二、动态链接库(动态应变量库,也称为共享库
     拉长说名这种应变量通常类似地拉长说。
编制行动动态库是在编制时编制的。,顺序中孤独地无论哪些人向导场所。,终极创作的可处决顺序中可是记载了动态链接库的名字、大大地等小量表达相通。,动态链接库并缺席跟随源用纸覆盖一齐符合到可处决用纸覆盖中,只当可处决用纸覆盖需求应用应变量库时。,顺序将读取。鉴于可处决用纸覆盖孤独地向导(或地址)。,不组编库的物质。,因而它会更小。
传令嘉奖一则组编源用纸覆盖。,应用动态库时,编制时,零碎只编制源用纸覆盖以创作可处决用纸覆盖。,并且在中组编了动态链接库在零碎的地址或许大大地.当处决时,零碎会到选定的的地址或大大地去读取动态链接库.
孤独处决使适应:鉴于动态链接库是在需求的举行读取,对应的地应变量库必需品在。,并且体育馆的布头是不克不及更改的。鉴于孤独地向导是,即,当您缺少应用动态库时。,该课程将有效的在一定的大大地下懂得。,对应的地,动态库不克不及恣意移走或使死亡。,这将挤入很大程度上选定的遗传密码的处决。
晋级困难尽管不愿意很的可处决用纸覆盖不克不及孤独运转。,只是,鉴于其读出效能。,因而,当体育馆晋级时,处决用纸覆盖不再需求重行编制。,处决用纸覆盖会直的读出新的应变量库用纸覆盖(先决条件的是应变量库新旧版本中用纸覆盖名及大大地不动).

三、动态应变量库和动态库的增刊。
口号,动态库在链接阶段链接。,对应的地,创作的可处决用纸覆盖不受库的挤入。,虽然使死亡非库。,顺序依然可以成运转。动态库在预调时链接,因而,虽然编制顺序,体育馆必需品留在零碎中。,命令顺序运转。
在一种意义上,链接动态库是贴完全一样的。,只不外它手柄的对象是目的选定的遗传密码而不是源码便了.鉴于动态库被链接后就直的嵌入可处决用纸覆盖中了,但这结果了两个成绩。
(1)消耗了零碎投宿。
这是不言而喻的。假设多个用纸覆盖链接到同无论哪些人库,,每个创作的可处决用纸覆盖都有无论哪些人库的正本。,一定波
免费零碎投宿。
(2)虽然是及格刻意调节器的体育馆。,不能废除的地会有口误。一旦一下子看到,就有bug,保护起来构成麻烦的。笔者必需品把顺序与体育馆吃或喝起来。
找浮现,那么重行编制.而动态库的涌现正补救了动态库的越过侮辱.鉴于动态库是在顺序运转时被链接的,因而只需在磁盘上保护无论哪些人正本。,对应的地节省磁盘投宿。假设你一下子看到bug或晋级,它也不普通的复杂。,用新的替代怪人的。
无论动态库就无缘无故了呢?非也.假设你用libpcap库编了无论哪些人顺序,由居住于经纪。,并且他的零碎不组编pCAP库。,最复杂的办法是将拿链接的库成为动态库。,很,你可以直的在居住于的零碎上运转顺序。
只鉴于动态库在顺序运转时是链接的。,故顺序的运转裁判高声吹哨和链接动态库的版本比拟一定会不值钱的.动态库的不可相对于它结果的善良下几乎是微不可道的,对应的地,链接顺序通常在链接时动态链接库。,应用动态限制因素选定的链接动态库。
四、Linux动态/动态库
     鉴于Linux零碎说话中肯套件依赖性太复杂。,假设应用过多的动态应变量库,这将给零碎的晋级结果很大的麻烦的。因而在Linux,次要应用动态应变量库。,
最次要的发生因果关系执意应变量库晋级近便的.
压倒的多数的应变量库都放在:
/lib
/usr/lib
/lib/modules (Linux心脏库)
五、检查用纸覆盖中应用的集中应变量典型
    办法: file 用纸覆盖名
命令用纸覆盖可用于决定用纸覆盖典型。在用纸覆盖相通下,拿用纸覆盖将被表露。偶然他们可以经过前额下载或用纸覆盖。,后缀著名的将抓住奇异。,到linux有些老手就不知道怎地失压了.但linux下的用纸覆盖典型一点也没有受用纸覆盖加词尾的挤入,对应的地,您可以先应用命令用纸覆盖。 XXX。检查用纸覆盖典型。,那么应用TAR加完完全全地的限制因素举行失压缩。

    在Linux中还可以应用ldd命令用来邮票目的顺序(由命令行限制因素选定的)所链接的拿动态库的相通.假设目的顺序缺席链接动态库,那么邮票
“not a dynamic executable”.
体式: ldd [用纸覆盖名]
传令嘉奖: [根]本土作为主人 /]#ldd /usr/bin/passwd
linux-gate.so.1 => 

         (0x00d19000)
... ...
libpam_misc.so.0 => /lib/libpam_misc.so.0 

         (0x00bd6000)
可以看出,/UR/BIN/PASSWD应用动态集中应变量。
六、创办动态集中应变量编制GCC、链接
当处决可处决用纸覆盖时,用户必需品界说动态库和头用纸覆盖的大大地。在Linux,该大大地可分为零碎大大地和电流大大地。,有4种境遇。,1是以后大大地下的动态库和头用纸覆盖。;2是零碎大大地下的动态库和头用纸覆盖。3是DYNA。,头用纸覆盖在以后大大地下。;4是以后大大地下的动态库。,零碎大大地下的头用纸覆盖。以下4例解说
1、动态集中应变量和头用纸覆盖都在以后大大地下。
方法1:创办动态集中应变量
创办头用纸覆盖
创办三.c用纸覆盖、、
将这4个用纸覆盖编制成动态库
(1)应用VIM编辑零件创办这4个用纸覆盖。
:
#include
#include
extern void test1(void);
extern void test2(void);
extern void test3(void);

#include ""
void test1(void)
{
Primtf(这事 is a test1 program!/n");
}

#include ""
void test2(void)
{
Primtf(这事 is a test2 program!/n");
}

#include ""
void test3(void)
{
Primtf(这事 is a test3 program!/n");
}
(2)应用GCC创办动态库。
[root@loalhost lishuai]#gcc -shared -o
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
这就成地创办了无论哪些人动态库。
正文:
<1> -shared    : 创办动态库
: 这是由动态应变量库著名的称选定的的作曲体式。我,以SO结束,中枢是动态应变量库著名的称。
<2> 进行动态库时,不喜欢头用纸覆盖。,即:
不克不及写为:GCC -shared -o
<3> 进行动态链接库时,GCC不喜欢限制因素-L、-l、-I,这些限制因素只在链接应变量库时应用。,而不是应用应变量库。
方法2:创办需求链接动态应变量库的主应变量
在方法1中先前成创作了无论哪些人用户本身的动态链接库,库的效能是经过顺序命令的。源用纸覆盖
:
#include ""
int 主(空)
{
test1();
test2();
test3();
return 0;
}

  方法3:将主应变量与动态库链接创作处决库
在方法1中创办了无论哪些人动态库。
在方法2中,需求动态应变量库的次要效能有蜂
对应的地,接下来,需求创作可处决用纸覆盖。
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
[root@loalhost lishuai]#gcc -L./ 列特 -o
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
正文:GCC的编制选择
-L 大大地     选定的附加集中应变量搜索大大地DIR,对应的地,-L. /讲授选定的应变量库的大大地为
-l 应变量库著名的 选定的链接所需的对立面应变量库,嗨是L后跟体育馆的名字。,即勘探,而不是
方法4:处决可处决用纸覆盖
在处决二元系用纸覆盖以前,先应用ldd来检查在用纸覆盖所应用的动态链接库的相通.
[root@loalhost lishuai]#ldd
=> not found
零碎却提示符缺席找到该动态链接库.
这是鉴于头用纸覆盖和动态库在以后的PAT下。,未检出的零碎,你可以修正環境變數的值LD-LabVIELY.PATH。,让零碎找到动态库。
[root@loalhost lishuai]#echo $LD_LIBRARY_PATH
此刻零碎中缺席显示无论哪些东西。,讲授環境變數LD.LabVIELY.PATH缺席值。
[root@loalhost lishuai]#export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
这将以后布头添加到搜索大大地中。
处决可处决用纸覆盖
[root@loalhost lishuai]#./
this is a test1!
this is a test2!
this is a test3!
到这地步,实现预期的结果动态应变量库的创作和装满。

2、动态集中应变量和头用纸覆盖都在零碎大大地下。
方法1:反复处决1、说话中肯方法1、2
方法2:将动态应变量库放在零碎大大地下/lib或/usr/lib
将头用纸覆盖放在零碎大大地下/usr/include
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
[root@loalhost lishuai]#mv /lib
[root@loalhost lishuai]#mv /usr/include
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
方法3:将主应变量与动态库链接创作处决库
在方法1中,创办了动态库。,并创办了需求动态库的次要效能。,接下来,需求创作可处决用纸覆盖。
[root@loalhost lishuai]#gcc -o 列特 -I/usr/include
或许:
[root@loalhost lishuai]#gcc -o 列特
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
[root@loalhost lishuai]#./
this is a test1!
this is a test2!
this is a test3!
正文:<1>动态应变量库已定位在零碎大大地下。,因而,链接时不再需求界说限制因素"-L"了.零碎会自动地到对应的大大地下查找.但依然需求选定的该动态集中应变量的名字,即,必需品界说限制因素L。,也需求有该大大地下应变量库著名的).无论是动态库蒸馏器动态应变量库。,头用纸覆盖的场所缺少一点也没有死板的。,嗨不克不及设置限制因素-i。
<2>当动态库就座零碎大大地下。时,就不再需求零钱環境變數LD_LIBRARY_PATH了.
3、动态库就座零碎大大地下。,而头用纸覆盖在以后大大地下。:
方法1:反复处决1、说话中肯方法1、2
方法2:将动态应变量库放在零碎大大地下/lib或/usr/lib
头用纸覆盖依然定位在以后大大地下。
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
[root@loalhost lishuai]#mv /lib
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
方法3:将主应变量与动态库链接创作处决库
在方法1中,创办了动态库。,并创办了需求动态库的次要效能。,接下来,需求创作可处决用纸覆盖。
[root@loalhost lishuai]#gcc -o 列特

         [root@loalhost lishuai]#gcc -o 列特 -I./
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
[root@loalhost lishuai]#./
this is a test1!
this is a test2!
this is a test3!
正文:
无论是动态库蒸馏器动态应变量库。,头用纸覆盖的场所缺少一点也没有死板的。,嗨不克不及设置限制因素-i。
4、零碎大大地下的头用纸覆盖,动态库存在以后的大大地下。
方法1:反复处决1、说话中肯方法1、2
方法2:将头用纸覆盖定位在零碎大大地/URR中
动态库依然定位在以后大大地下。
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
[root@loalhost lishuai]#mv /usr/include
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
方法3:将主应变量与动态库链接创作处决库
在方法1中,创办了动态库。,并创办了需求动态库的次要效能。,接下来,需求创作可处决用纸覆盖。
[root@loalhost lishuai]#gcc -o -L./ 列特 -I/usr/include
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
[root@loalhost lishuai]#export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
[root@loalhost lishuai]#./
this is a test1!
this is a test2!
this is a test3!

七、动态体育馆综述
1.进行动态库时,它的体式是: 动态库互插.c用纸覆盖(除非.h用纸覆盖) -shared -o
正文:
<1>动态库是二元系方式的。,它也无论哪些人.O用纸覆盖。
<2>鉴于用户会、、编制成动态库。,对应的地在"动态库互插.c用纸覆盖(除非.h用纸覆盖)"中需求将这3个用纸覆盖都列出,但笔者需求在意的是,不克不及组编头用纸覆盖。
<3>当gcc编制动态应变量库时,必需品附带说明限制因素-shared.
<4>动态应变量库著名的的体式是,中枢的xxx是动态应变量库真正的名字.
2.链接动态应变量库时,gcc次要用到了3个限制因素,零件是-L、-l、-I.
<1>-L DIR     :选定的额定的动态集中应变量搜索大大地DIR.当用户不选定的动态应变量库的大大地时,零碎会自动地在零碎大大地下查找.
<2>-l LIBRARY :选定的链接时需求的集中应变量名字.这事轻易懂得,应用限制因素-L选定的了集中应变量大大地,则限制因素-l就选定的了该大大地下集中应变量的名字.不外需求特殊在意的是,在进行动态集中应变量时,应变量库著名的字必需品写成的方式,流行,孤独地xxx是应变量库的真实名字,因而限制因素-l后接应变量库的真实名字,即-lxxx,而不是-l.
<3>-I DIR     :选定的额定的头用纸覆盖搜索大大地.无论是动态库蒸馏器动态应变量库。,头用纸覆盖的场所缺少一点也没有死板的。,嗨不克不及设置限制因素-i。
八、创办动态集中应变量及gcc的编制、链接
     当处决可处决用纸覆盖时,用户必需品清楚的动态应变量库和头用纸覆盖的大大地.在Linux中,该大大地可分为零碎大大地和电流大大地。,有4种境遇。,1是动态应变量库和头用纸覆盖均在以后大大地下;2是动态应变量库和头用纸覆盖均在零碎大大地下.3是动态应变量库在零碎大大地下,头用纸覆盖在以后大大地下。;4是动态应变量库在以后大大地下,零碎大大地下的头用纸覆盖。以下4例解说

1、动态集中应变量和头用纸覆盖都在以后大大地下:
方法1:创办动态集中应变量
创办头用纸覆盖
创办三.c用纸覆盖、、
将这4个用纸覆盖编制成无论哪些人动态库:
(1)应用VIM编辑零件创办这4个用纸覆盖。
:
#include
#include
extern void test1(void);
extern void test2(void);
extern void test3(void);

#include ""
void test1(void)
{
Primtf(这事 is a test1 program!/n");
}

#include ""
void test2(void)
{
Primtf(这事 is a test2 program!/n");
}

#include ""
void test3(void)
{
Primtf(这事 is a test3 program!/n");
}
方法2:应用GCC创办动态应变量库
[root@loalhost lishuai]#gcc -c -o test1.o
[root@loalhost lishuai]#gcc -c -o test2.o
[root@loalhost lishuai]#gcc -c -o test3.o
[root@loalhost lishuai]#ls
[root@loalhost lishuai]# test1.o test2.o test3.o
[root@loalhost lishuai]#ar rc test1.o test2.o test3.o
[root@loalhost lishuai]#ls
[root@loalhost lishuai]# test1.o test2.o test3.o
很,成创办了无论哪些人动态应变量库。
正文:
<1> : 这是动态应变量库著名的所规则的写体式.以"lib"提出,以A结束,中枢是动态应变量库著名的.
<2> 进行动态链接库时,GCC不喜欢限制因素-L、-l、-I,这些限制因素只在链接应变量库时应用。,而不是应用应变量库。
<3> 动态应变量库的进行办法
1。零件编制应变量库中组编的用纸覆盖。,并将其编制成.o用纸覆盖.如,动态应变量库中组编了、、,需求应用gcc将其零件编制成.o用纸覆盖.
2.再用ar rc将所局部.o用纸覆盖进行成动态应变量库.
流行,-c是create的意义,-r是replace的意义,表现当拔出的应变量库著名的先前在库中在,则掉换歧义的库.ar是显示口误相通.
方法3:创办需求链接动态应变量库的主应变量
在方法2中先前成创作了无论哪些人用户本身的动态链接库,库的效能是经过顺序命令的。源用纸覆盖
:
#include ""
int 主(空)
{
test1();
test2();
test3();
return 0;
}
方法4:将主应变量与动态应变量库一齐链接创作可处决用纸覆盖.
在方法2中先前创办了动态应变量库.
在方法3中先前创办了需求该动态应变量库的主应变量.
对应的地,接下来,需求创作可处决用纸覆盖。
[root@loalhost lishuai]#ls
[root@loalhost lishuai]# test1.o test2.o test3.o
[root@loalhost lishuai]#gcc -o
或许:
[root@loalhost lishuai]#gcc -L./ 列特_static -o
[root@loalhost lishuai]#./
this is a test1!
this is a test2!
this is a test3!
正文:
<1>下面的例程中有两种创作的办法.
在办法一中,选出而尚未上任的了创作可处决用纸覆盖所需求的两个用纸覆盖,这两个用纸覆盖零件是主应变量和动态应变量库;
在办法二中,仅选出而尚未上任的了创作可处决用纸覆盖的主应变量,而动态应变量库是用大大地、应变量库著名的来表现的,这种办法可贴性更广.
<2>鉴于进行的是动态应变量库,因而就不再需求零钱環境變數LD_LIBRARY_PATH了.
2、动态集中应变量和头用纸覆盖都在零碎大大地下:
    方法1:反复处决1、说话中肯方法1、2、3
方法2:将动态应变量库放在零碎大大地下/lib或/usr/lib
将头用纸覆盖放在零碎大大地下/usr/include 
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#mv /usr/lib
[root@loalhost lishuai]#mv /usr/include
[root@loalhost lishuai]#ls
[root@loalhost lishuai]# test1.o test2.o test3.o
方法3:将主应变量与动态应变量库链接创作可处决用纸覆盖
在方法1中先前创办了动态应变量库,且先前创办了需求该动态应变量库的主应变量.对应的地,接下来,需求创作可处决用纸覆盖。
[root@loalhost lishuai]#gcc 列特_static -o
或许:
[root@loalhost lishuai]#gcc -L/usr/lib 列特_static -I/usr/include -o
[root@loalhost lishuai]#ls
[root@loalhost lishuai]# test1.o test2.o test3.o
[root@loalhost lishuai]#./
this is a test1!
this is a test2!
this is a test3!
正文:鉴于已将动态应变量库放在了零碎大大地下,因而,链接时不再需求界说限制因素"-L"了.零碎会自动地到对应的大大地下查找.但依然需求选定的该动态集中应变量的名字,即,必需品界说限制因素L。,也需求有该大大地下应变量库著名的).无论是动态库蒸馏器动态应变量库。,头用纸覆盖的场所缺少一点也没有死板的。,嗨不克不及设置限制因素-i。
3、动态应变量库在零碎大大地下,而头用纸覆盖在以后大大地下。:
方法1:反复处决1、说话中肯方法1、2
方法2:将动态应变量库放在零碎大大地下/lib或/usr/lib
头用纸覆盖依然定位在以后大大地下。
[root@loalhost lishuai]#ls
[root@loalhost lishuai]# test1.o test2.o test3.o
[root@loalhost lishuai]#mv /usr/lib
[root@loalhost lishuai]#ls
[root@loalhost lishuai]# test1.o test2.o test3.o
方法3:将主应变量与动态应变量库链接创作可处决用纸覆盖
在方法1中先前创办了动态应变量库,且先前创办了需求该动态应变量库的主应变量.对应的地,接下来,需求创作可处决用纸覆盖。
[root@loalhost lishuai]#gcc -L/usr/lib 列特_static -o

         [root@loalhost lishuai]#gcc -L/usr/lib 列特_static -I./ -o
[root@loalhost lishuai]#ls
[root@loalhost lishuai]#
[root@loalhost lishuai]#./
this is a test1!
this is a test2!
this is a test3!
正文:
无论是动态库蒸馏器动态应变量库。,头用纸覆盖的场所缺少一点也没有死板的。,嗨不克不及设置限制因素-i。
4、零碎大大地下的头用纸覆盖,而动态应变量库在以后大大地下:
    方法1:反复处决1、说话中肯方法1、2
方法2:将头用纸覆盖定位在零碎大大地/URR中
将动态应变量库依然放在以后大大地下.
[root@loalhost lishuai]#ls
[root@loalhost lishuai]# test1.o test2.o test3.o
[root@loalhost lishuai]#mv /usr/include
[root@loalhost lishuai]#ls
[root@loalhost lishuai]# test1.o test2.o test3.o
方法3:将主应变量与动态应变量库链接创作可处决用纸覆盖
在方法1中先前创办了动态应变量库,且先前创办了需求该动态应变量库的主应变量.对应的地,接下来,需求创作可处决用纸覆盖。
[root@loalhost lishuai]#gcc -o -L./ 列特_static
或许
[root@loalhost lishuai]#gcc -o -L./ 列特_static -I./
[root@loalhost lishuai]#ls
[root@loalhost lishuai]# test1.o test2.o test3.o
[root@loalhost lishuai]#./
this is a test1!
this is a test2!
this is a test3! 

Attention!!!

    进行动态库和动态库时,.c和.h用纸覆盖都必需品在同一的大大地下.而在链接动态库和动态库时,库和头用纸覆盖可以不在场的同一的大大地下. 

责任编辑:admin

频道精选