安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

静态库和动态库(Linux版)

7月19日 夜如影投稿
  1静态库和动态库概述
  库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。库有两种:静态库和动态库。Windows系统包括静态链接库(。lib文件)和动态链接库(。dll文件)。Linux通常把库文件存放在usrlib或lib目录下。Linux库文件名由:前缀lib、库名和后缀3部分组成,其中动态链接库以。so作为后缀,静态链接库通常以。a作为后缀。
  何为静态库和动态库?
  静态库(Staticlibrary,Staticallylinkedlibrary,LIB)或称静态链接库,是一个外部函数与变量的集合体。静态库的文件内容,通常包含一堆程序员自定的变量与函数,在编译期间由编译器与连接器将它集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件。而这个可执行文件与编译可执行文件的程序,都是一种程序的静态创建(staticbuild)。其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令全部被直接包含在最终生成的可执行文件中。
  动态库(Dynamiclibrary,Dynamiclinklibrary,DLL)或称动态链接库,是微软公司在微软视窗操作系统中实现共享函数库概念的一种实现方式。动态链接库可被多个程序同时使用。所谓动态链接,就是把一些经常会共用的代码(静态链接的OBJ程序库)制作成DLL档,当程序有需求时函数才进行链接。透过动态链接方式,存储器浪费的情形将可大幅降低。静态链接库则是直接链接到可执行文件。
  一个程序编译成可执行的步骤:
  静态库和动态库的区别在链接阶段如何处理库,如果将库链接到目标代码中则是静态库,而将库链接载入推迟到程序运行的时期则是动态库,可以实现进程之间的资源共享。2Linux创建和使用静态库
  前面已经介绍了静态库的概念,下面我们通过一个实例来看静态库的使用。2。1生成静态库
  1)这里准备了两个库的源码st1、st2用它们来制作库libmytest。a,如下
  lsl
  catst1。cincludestdio。hvoidprint1(){printf(Hello!Iamst1!);}
  catst2。cincludestdio。hvoidprint2(){printf(Hello!Iamst2!);}
  catmain。cincludestdio。hintmain(intargc,constcharargv〔〕){print1();print2();return0;}
  2)生成libmytest。a文件
  创建静态库用ar命令,它将很多。o转换成。a
  gcccst1。cst2。c
  arcrslibmytest。ast1。ost2。o
  lsl
  filelibmytest。a
  静态库文件libmytest。a已经生成,用file命令查看其属性,发现它确实是归档压缩文件。用artlibmytest。a可以查看一个静态库包含了那些obj文件:
  artlibmytest。a
  2。2使用静态库
  直接使用
  gccotestmain。clibmytest。a
  双L链接法
  gccotestmain。clmytestL。(库所在目录,。表示当前目录)
  单L链接法(需要配置环境变量LIBRARYPATH,把库放在所在目录配置)
  gccotestmain。clmytest
  前面我们已经写好了main。c,现在测试一下
  gccotestmain。cL。lmytest
  lsl
  。test
  这里gcc的参数L是告诉编译器库文件的路径是当前目录,l是告诉编译器要使用的库的名字叫mytest。2。3静态库总结
  在一个头文件中声明静态库所导出的函数。
  在一个源文件中实现静态库所导出的函数。
  编译源文件,生成可执行代码。
  将可执行代码所在的目标文件加入到某个静态库中,并将静态库拷贝到系统默认的存放库文件的目录下。
  下面通过一个例子来说明:
  源文件:mylib。cincludestdio。hvoidwelcome(void){printf(welcometolibmylib);}
  1编译mylib。c生成目标文件:
  gccomylib。ocmylib。c
  2将目标文件加入到静态库中:
  arrcslibmylib。amylib。o
  【注】库文件名以lib开头,以。a结尾。
  3将静态库copy到Linux的库目录(usrlib或者lib)下:(也可以不拷贝,注意配置环境变量)
  sudocplibmylib。ausrliblibmylib。a管理员身份
  编写调用库函数的测试程序test。c:includestdio。hintmain(void){printf(createanduselibrary:);welcome();return0;}
  4使用静态库编译:
  gccotesttest。clmylib
  这里注意,编译时无需带上前缀和后缀。
  5运行可执行程序test:
  。test
  在Linux下,可以使用ar命令来创建和修改静态库。
  这些在linux下manar一下就可以得到参数,这里说明几个常用的
  d:从库中删除成员文件。
  r:在库中加入成员文件,若存在,则替换。
  c:创建一个库。
  s:无论ar命令是否修改了库内容,都强制重新生成库符号表。
  其他的命令用时再man。
  【注】gccstatic文件。c〔o文件〕全部使用静态库的方法3Linux创建和使用动态库
  动态库的基本概念
  1。动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。动态链接库是目标文件的集合,目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址是相对地址,不是绝对地址,其真实地址在调用动态库的程序加载时形成。
  2。动态链接库的名称有别名(soname),真名(realname)和链接名(linkername)。别名由一个前缀lib,然后是库的名字,再加上一个后缀。so构成(libxxx。so)。真名是动态链接库真实名称,一般总是在别名的基础加上一个小版本号,发布版本等构成。除此之外,还有一个链接名,即程序链接时使用的库的名字。
  3。在动态链接库安装的时候,总是复制文件到某个目录下,然后用一个软连接生成别名,在库文件进行更新的时候,仅仅更新软链接即可。
  下面我们通过一个实例来学习如何生成动态库和使用动态库。3。1生成动态库
  1)当前文件夹下有下面四个文件
  lsl
  文件内容分别为:
  catmylib。hifndefMYLIBHdefineMYLIBHincludestdio。hvoidprint1();voidprint2();endif
  catdy1。cincludemylib。hvoidprint1(){printf(Myfirstsharedlib!);}
  catdy2。cincludemylib。hvoidprint2(){printf(Mysecondsharedlib!);}
  catmain。cincludemylib。hintmain(intargc,charargv〔〕){print1();print2();return0;}
  2)这里我们将dy1。c与dy2。c用来创建动态库
  gccfPICWallcdy1。cdy2。c
  gccsharedolibtest。sody1。ody2。o
  这里fPIC创建与地址无关的编译程序,shared指定生成动态链接库。
  我们也可以一步到位
  gccolibtest。sofPICshareddy1。cdy2。c
  我们可以看到下面已经生成了一个libtest。so
  lsl
  3。2使用动态链接库
  在编译程序时,使用动态链接库和静态库是一致的,使用l库名的方式,在生成可执行文件的时候会链接库文件。使用如下命令:
  gccotestmain。cL。ltest
  lsl
  这里L指定动态链接库的路劲,ldtest链接库函数test。ltest是动态库的调用规则。Linux系统下的动态库命名方式是lib。so,而在链接时表示位l,是自己命名的库名。
  我们可以看到这里已经生成了test可执行文件,我们可以执行一下:
  。test
  可以发现发生了错误,这是因为程序运行时没有找到动态链接库造成的。程序编译时链接动态库和运行时使用动态链接库的概念是不同的,在运行时,程序链接的动态链接库需要在系统目录下才行。
  这就到了动态库的路径问题,有三种方法:
  1)把库拷贝到usrlib和lib目录下:
  sudocplibtest。solib
  【注】这里要超级用户权限sudo
  我们看一下执行结果:
  。test
  这里执行结果正确。
  2)在LDLIBRARYPATH环境变量中加上库所在路径
  exportLDLIBRARYPATHpwd:LDLIBRARYPATH
  我们可以看到:libtest。so的路径已经存在
  lddtest
  我们可以看一下结果:
  。test
  也能得到正确结果。
  3)添加etcld。so。conf。d。conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新。
  cdetcld。so。conf。d
  ls
  sudovimy。conf
  catmy。confhomebruceoudemolibtest。so
  在etcld。so。conf。d下建立my。conf里面只有一句homebruceoudemolibtest。so即libtest。so的路径,然后执行ldconfig刷新即可。3。3动态库总结
  1。编译动态库
  方法一:
  命令:gccfPICWallc。c
  命令:gccsharedolib。so。o
  方法二:
  命令:gcc。c。c。cfPICsharedolib。so
  2。安装路径
  命令:cplib。sousrliblib。so管理员身份
  3。动态库的链接
  命令:gcco。cL。l
  或者:命令:gcc。cL。lo
  4。运行可执行程序
投诉 评论 转载

索赔1。3亿美国体坛最大丑闻发酵奥运冠军也被侵犯FBI向她们有些时候,悲剧是很难避免的,但同样的悲剧屡次上演,就绝对不是偶然了。北京时间4月30日,美国联邦调查局局长克里斯托弗雷公开表态,对因为纳萨尔的起诉延误而造成伤害的所有女运……四项数据联盟第1,杜兰特放心养伤!哈登没看错人,篮网迎高回报本赛季NBA常规赛过半,东部整体局势比较明朗,纳什在赛季初带队2胜5负黯然下课后,新帅雅克沃恩上任篮网主帅以来,带队25胜8负,从东部十名开外直接杀到东部第二的位置。沃恩对于培……静态库和动态库(Linux版)1静态库和动态库概述库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。库有两种:静态库和动态库。Windows系统包括静态链接库(。lib文件)和动……拉伊卜王子的身世首次被公开卡拉卡塔尔世界杯小王子拉伊卜,因为在观众席上发表对球队不满的表情,在短短半个月内便吸粉数千万,成为了千万级大V。小王子在走红后也有了偶像包袱,他看到有视频博主在拍摄的时候……第五届进博会消费品展区热度最高,乒乓球教练机器人最受关注第五届进博会传播影响力究竟有多大?1月9日下午,进博局举行《第五届进博会传播影响力报告》发布暨第六届进博会企业商业展签约仪式。报告披露,第五届进博会曝光总量超56亿次,获……ARM拒绝向中企销售先进芯片设计产品有什么后果ARM拒绝向中企销售先进芯片设计产品一事引起了广泛关注。ARM是英国的一家半导体公司,拥有世界上最先进的芯片设计技术。该公司的芯片设计产品可用于制造手机、平板电脑和电脑等……你是否也像我一样迷茫?挑战3天在头条写日记2022年快结束了,有多少人像我一样?期待的日子不要过那么快。小时候的自己想到新年快到,都是无比的快乐与高兴,成年后的我想到家庭的压力,时时刻刻都是紧绷着精……丁雄军激荡茅台365天万字复盘丁雄军执掌茅台这一年本文已获得授权来源:酒业家ID:jiuyejia360今天,8月30日,是历史长河中平凡的一天,但于茅台的发展史而言,却是值得浓墨重彩的……注意!2023年电力市场化交易规则有调整,快看衢州的工商业电力用户们,注意了!2023年浙江省电力市场交易即将开始,在2022年基础上,明年浙江省电力市场交易在诸多方面有了变化,快来了解一、2023年交易规则新变化……Technics与小川理子不做黑胶唱机,还能成为真正的Tec时隔13年之久,小川理子又回到了最初的地方,这时她的身份已经是家庭娱乐事业部的音响发展战略责任理事。重启Technics摆在她面前的首要任务,就是当年九月份的德国消费电子交易会……卿卿日常为何能火出圈?看看这5位男演员的高光时刻就知道了女演员各个明媚动人,赏心悦目,让观众犹如进入百花园。男演员各个英俊潇洒,个性鲜明,让观众越看越爱,越追越过瘾。不得不说,古装轻喜剧《卿卿日常》,算是2022年底杀出……王者硅来,迎接跨年躁动在碳中和大势之下,新能源布局加速促使硅能源产业投资火热。12月2日,绿色低碳品种工业硅期货和期权交易获得证监会批准,上市在即。作为广州期货交易所设立以来的首个新能源金属交……
每天坚持吃一个煮熟的苹果,有什么好处?这几类人不妨多吃关于汾河公园四期的想法畅连华为的微信聊天工具,能攻下山头吗?浪漫的遗憾!NCAA半决赛杜克惜败北卡,千胜教头结束42年坚地球为何没选择硅基生命,却选择了碳基生命?硅基生命长啥样选对包包长高?最适合学生党的4款夏季包包,平价又时髦老詹失误次数历史第一万年奇观,绝世美景,邀您共赏鹅鸭杀goosegooseduck卡顿掉帧?解决方案来了CBA最新积分榜同曦力擒福建飙升第六,广厦击溃宁波,攀升第五2023年寄生前夜有望迎来重置版奥利维亚杰德现身街头,身穿绿色运动套装搭白外套尽显活力十足

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利