仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 421|回复: 8
打印 上一主题 下一主题

[其他Linux] 来一发Linux操纵体系中毗连库的天生

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 17:24:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
要明白学好linux不是一件一蹴而就的事,一定要能坚持使用它,特别是在使用初期。

  库有静态与静态两种,静态一般用。so为后缀,静态用。a为后缀。比方:libhello.solibhello.a
 
  为了在统一体系中利用分歧版本的库,能够在库文件名后加上版本号为后缀,比方:libhello.so.1.0,因为程序毗连默许以。so为文件后缀名。以是为了利用这些库,一般利用创建标记毗连的体例。
 
  ln-slibhello.so.1.0libhello.so.1
 
  ln-slibhello.so.1libhello.so
 
  利用库
 
  当要利用静态的程序库时,毗连器会找出程序所需的函数,然后将它们拷贝到实行文件,因为这类拷贝是完全的,以是一旦毗连乐成,静态程序库也就不再必要了。但是,对静态库而言,就不是如许。静态库会在实行程序内留下一个标志‘指明当程序实行时,起首必需载进这个库。因为静态库节俭空间,linux下举行毗连的缺省操纵是起首毗连静态库,也就是说,假如同时存在静态和静态库,不出格指定的话,将与静态库相毗连。
 
  如今假定有一个叫hello的程序开辟包,它供应一个静态库libhello.a一个静态库libhello.so,一个头文件hello.h,头文件中供应sayhello()这个函数
 
  /*hello.h*/
 
  voidsayhello();
 
  别的另有一些申明文档。这一个典范的程序开辟包布局
 
  1.与静态库毗连
 
  linux默许的就是与静态库毗连,上面这段程序testlib.c利用hello库中的sayhello()函数
 
  /*testlib.c*/
 
  #include
 
  #include
 
  intmain()
 
  {
 
  sayhello();
 
  return0;
 
  }
 
  利用以下命令举行编译
 
  $gcc-ctestlib.c-otestlib.o
 
  用以下命令毗连:
 
  $gcctestlib.o-lhello-otestlib
 
  在毗连时要注重,假定libhello.o和libhello.a都在缺省的库搜刮路径下/usr/lib下,假如在别的地位要加上-L参数
 
  2.与静态库毗连贫苦一些,次要是参数成绩。仍是下面的例子:
 
  $gcctestlib.o-otestlib-WI,-Bstatic-lhello
 
  注:这个出格的"-WI,-Bstatic"参数,实践上是传给了毗连器ld.
 
  唆使它与静态库毗连,假如体系中只要静态库固然就不必要这个参数了。
 
  假如要和多个库相毗连,而每一个库的毗连体例纷歧样,好比下面的程序既要和libhello举行静态毗连,又要和libbye举行静态毗连,其命令应为:
 
  $gcctestlib.o-otestlib-WI,-Bstatic-lhello-WI,-BdynamicClbye
 
  3.静态库的路径成绩
 
  为了让实行程序顺遂找到静态库,有三种办法:
 
  (1)把库拷贝到/usr/lib和/lib目次下。
 
  (2)在LD_LIBRARY_PATH情况变量中加上库地点路径。比方静态库libhello.so在/home/ting/lib目次下,以bash为例,利用命令:
 
  $exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ting/lib
 
  (3)修正/etc/ld.so.conf文件,把库地点的路径加到文件开端,并实行ldconfig革新。如许,到场的目次下的一切库文件都可见。
 
  4.检察库中的标记
 
  偶然候大概必要检察一个库中究竟有哪些函数,nm命令能够打印出库中的触及到的一切标记。库既能够是静态的也能够是静态的。nm列出的标记有良多,罕见的有三种,一种是在库中被挪用,但并没有在库中界说(标明必要其他库撑持),用U暗示;一种是库中界说的函数,用T暗示,这是最多见的;别的一种是所谓的“弱态”标记,它们固然在库中被界说,可是大概被其他库中的同名标记掩盖,用W暗示。比方,假定开辟者但愿晓得上文提到的hello库中是不是界说了printf():
 
  $nmlibhello.so|grepprintf
 
  Uprintf
 
  U暗示标记printf被援用,可是并没有在函数内界说,由此能够揣度,要一般利用hello库,必需有别的库撑持,再利用ldd命令检察hello依附于哪些库:
 
  $lddhello
 
  libc.so.6=>/lib/libc.so.6(0x400la000)
 
  /lib/ld-linux.so.2=>/lib/ld-linux.so.2(0x40000000)
 
  从下面的了局能够持续检察printf终极在那里被界说,有乐趣能够goon
 
  天生库
 
  第一步要把源代码编绎成方针代码。以上面的代码为例,天生下面用到的hello库:
 
  /*hello.c*/
 
  #include
 
  voidsayhello()
 
  {
 
  printf("hello,world
");
 
  }
 
  用gcc编绎该文件,在编绎时可使用任何全法的编绎参数,比方-g到场调试代码等:
 
  gcc-chello.c-ohello.o
 
  (1)。毗连成静态库
 
  毗连成静态库利用ar命令,实在ar是archive的意义
 
  $arcqslibhello.ahello.o
 
  (2)。毗连成静态库
 
  天生静态库用gcc来完成,因为大概存在多个版本,因而一般指定版本号:
 
  $gcc-shared-Wl,-soname,libhello.so.1-olibhello.so.1.0hello.o
 
  别的再创建两个标记毗连:
 
  $ln-slibhello.so.1.0libhello.so.1
 
  $ln-slibhello.so.1libhello.so
 
  如许一个libhello的静态毗连库就天生了。最主要的是传gcc-shared参数使其天生是静态库而不是一般实行程序。
 
  -Wl暗示前面的参数也就是-soname,libhello.so.1间接传给毗连器ld举行处置。实践上,每个库都有一个soname,当毗连器发明它正在查找的程序库中有如许一个称号,毗连器便会将soname嵌进保持中的二进制文件内,而不是它正在运转的实践文件名,在程序实行时代,程序会查找具有soname名字的文件,而不是库的文件名,换句话说,soname是库的辨别标记。
 
  如许做的目标次要是同意体系中多个版本的库文件共存,习气上在定名库文件的时分一般与soname不异
 
  libxxxx.so.major.minor
 
  个中,xxxx是库的名字,major是主版本号,minor是次版本号</p>
如果你让他去用linux搭建一个web服务器,做一个linux网关,他就什么都不会了.他们把时间都浪费在了版本的转换上了.
蒙在股里 该用户已被删除
沙发
发表于 2015-1-18 17:56:19 | 只看该作者
清楚了解网络的基础知识,特别是在Linux下应用知识,如接入internet等等。
活着的死人 该用户已被删除
板凳
发表于 2015-1-26 15:51:04 | 只看该作者
我想即使Linux高手也很难快速准确精练的回答你。
海妖 该用户已被删除
地板
发表于 2015-2-4 20:30:53 | 只看该作者
不同于Windows?系统需要花钱购买,因为Linux的核心是免费的,自由使用的,核心源代码是开放的。
再见西城 该用户已被删除
5#
发表于 2015-2-10 07:29:39 | 只看该作者
任何人都可以根据自己的喜好来定制适合自己的操作系统,Linux?是抢占式多任务多用户操作系统.
金色的骷髅 该用户已被删除
6#
发表于 2015-3-1 03:23:27 | 只看该作者
随着Linux应用的扩展,出现了不少Linux社区。有一些非常优秀的社区往往是Linux高手的舞台,如果在探讨高级技巧的论坛张贴非常初级的问题经常会没有结果。
老尸 该用户已被删除
7#
发表于 2015-3-10 12:44:01 | 只看该作者
随着Linux应用的扩展,出现了不少Linux社区。有一些非常优秀的社区往往是Linux高手的舞台,如果在探讨高级技巧的论坛张贴非常初级的问题经常会没有结果。
若天明 该用户已被删除
8#
发表于 2015-3-17 07:12:38 | 只看该作者
我们这一代90后,从小接触的是windows98,家里条件好的自己有电脑装的是2000,后来又有了XP,上大学时又有了win7。
admin 该用户已被删除
9#
发表于 2015-3-24 02:25:01 | 只看该作者
随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-27 20:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表