仓酷云

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

[其他Linux] Linux设计Linux静态库(.so)搜刮路径仓酷云

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:39:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
要明白学好linux不是一件一蹴而就的事,一定要能坚持使用它,特别是在使用初期。
尽人皆知,Linux静态库的默许搜刮路径是/lib和/usr/lib。静态库被创立后,一样平常都复制到这两个目次中。当程序实行时必要某静态库,而且该动态库还未加载到内存中,则体系会主动到这两个默许搜刮路径中往查找响应的静态库文件,然后加载该文件到内存中,如许程序就能够利用该静态库中的函数,和该静态库的别的资本了。在Linux中,静态库的搜刮路径除默许的搜刮路径外,还能够经由过程以下三种办法来指定。
办法一:在设置文件/etc/ld.so.conf中指定静态库搜刮路径。
能够经由过程编纂设置文件/etc/ld.so.conf来指定静态库的搜刮路径,该文件中每举动一个静态库搜刮路径。每次编纂完该文件后,都必需运转命令ldconfig使修正后的设置失效。我们经由过程例1来讲明该办法。
例1:
我们经由过程以下命令用源程序pos_conf.c(见程序1)来创立静态库libpos.so,具体创立历程请参考文[1]。
#gcc-cpos_conf.c
#gcc-shared-fPCI-olibpos.sopos_conf.o
#
#include<stdio.h>
voidpos()
{
printf("/root/test/conf/lib");
}
程序1:pos_conf.c
接着经由过程以下命令编译main.c(见程序2)天生方针程序pos。
#gcc-oposmain.c-L.-lpos
#
voidpos();
intmain()
{
pos();
return0;
}
程序2:main.c
然后把库文件挪动到目次/root/test/conf/lib中。
#mkdir-p/root/test/conf/lib
#mvlibpos.so/root/test/conf/lib
#
最初编纂设置文件/etc/ld.so.conf,在该文件中追加一行"/root/test/conf/lib"。
运转程序pos尝尝。
#./pos
./pos:errorwhileloadingsharedlibraries:libpos.so:cannotopensharedobjectfile:Nosuchfileordirectory
#
堕落了,体系未找到静态库libpos.so。找找缘故原由,本来在编纂完设置文件/etc/ld.so.conf后,没有运转命令ldconfig,以是方才的修正还未失效。我们运转ldconfig后再尝尝。
#ldconfig
#./pos
/root/test/conf/lib
#
程序pos运转乐成,而且打印出准确了局。
办法二:经由过程情况变量LD_LIBRARY_PATH指定静态库搜刮路径。
经由过程设定情况变量LD_LIBRARY_PATH也能够指定静态库搜刮路径。当经由过程该情况变量指定多个静态库搜刮路径时,路径之间用冒号":"分开。上面经由过程例2来讲明本办法。
例2:
我们经由过程以下命令用源程序pos_env.c(见程序3)来创立静态库libpos.so。
#gcc-cpos_env.c
#gcc-shared-fPCI-olibpos.sopos_env.o
#
#include<stdio.h>
voidpos()
{
printf("/root/test/env/lib");
}
程序3:pos_env.c
测试用的可实行文件pos可使用例1中的失掉的方针程序pos,不必要再次编译。由于pos_conf.c中的函数pos和pos_env.c中的函数pos函数原型分歧,且静态库名不异,这就比如修正静态库pos后从头创立该库一样。这也是利用静态库的长处之一。
然后把静态库libpos.so挪动到目次/root/test/conf/lib中。
#mkdir-p/root/test/env/lib
#mvlibpos.so/root/test/env/lib
#
我们可使用export来设置该情况变量,在设置该情况变量后一切的命令中,该情况变量都无效。
比方:
#exportLD_LIBRARY_PATH=/root/test/env/lib
#
但本文为了举例便利,利用另外一种设置情况变量的办法,既在命令前加情况变量设置,该情况变量只对该命令无效,当该命令实行完成后,该情况变量就有效了。以下述命令:
#LD_LIBRARY_PATH=/root/test/env/lib./pos
/root/test/env/lib
#
程序pos运转乐成,而且打印的了局是"/root/test/env/lib",恰是程序pos_env.c中的函数pos的运转了局。因而程序pos搜刮到的静态库是/root/test/env/lib/libpos.so。
办法三:在编译方针代码时指定该程序的静态库搜刮路径。
还能够在编译方针代码时指定程序的静态库搜刮路径。这是经由过程gcc的参数"-Wl,-rpath,"指定(如例3所示)。当指定多个静态库搜刮路径时,路径之间用冒号":"分开。
例3:
我们经由过程以下命令用源程序pos.c(见程序4)来创立静态库libpos.so。
#gcc-cpos.c
#gcc-shared-fPCI-olibpos.sopos.o
#
#include<stdio.h>
voidpos()
{
printf("./");
}
程序4:pos.c
由于我们必要在编译方针代码时指定可实行文件的静态库搜刮路径,以是必要用gcc命令从头编译源程序main.c(见程序2)来天生可实行文件pos。
#gcc-oposmain.c-L.-lpos-Wl,-rpath,./
#
再运转程序pos尝尝。
#./pos
./
#
程序pos运转乐成,输入的了局恰是pos.c中的函数pos的运转了局。因而程序pos搜刮到的静态库是./libpos.so。
以上先容了三种指定静态库搜刮路径的办法,加上默许的静态库搜刮路径/lib和/usr/lib,共五种静态库的搜刮路径,那末它们搜刮的前后按次是甚么呢?
在先容上述三种办法时,分离创立了静态库./libpos.so、/root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so。我们再用源程序pos_lib.c(见程序5)来创立静态库/lib/libpos.so,用源程序pos_usrlib.c(见程序6)来创立静态库/usr/lib/libpos.so。
#include<stdio.h>
voidpos()
{
printf("/lib");
}
程序5:pos_lib.c
#include<stdio.h>
voidpos()
{
printf("/usr/lib");
}
程序6:pos_usrlib.c
这样我们失掉五个静态库libpos.so,这些静态库的名字不异,且都包括不异函数原型的公用函数pos。但存储的地位分歧和公用函数pos打印的了局分歧。每一个静态库中的公用函数pos都输入该静态库所寄存的地位。如许我们能够经由过程实行例3中的可实行文件pos失掉的了局分歧获知其搜刮到了哪一个静态库,从而取得第1个静态库搜刮按次,然后删除该静态库,再实行程序pos,取得第2个静态库搜刮路径,再删除第2个被搜刮到的静态库,云云来去,将可失掉Linux搜刮静态库的前后按次。程序pos实行的输入了局和搜刮到的静态库的对应干系如表1所示:
程序pos输入了局
利用的静态库
对应的静态库搜刮路径指定体例
./
./libpos.so
编译方针代码时指定的静态库搜刮路径
/root/test/env/lib
/root/test/env/lib/libpos.so
情况变量LD_LIBRARY_PATH指定的静态库搜刮路径
/root/test/conf/lib
/root/test/conf/lib/libpos.so
设置文件/etc/ld.so.conf中指定的静态库搜刮路径
/lib
/lib/libpos.so
默许的静态库搜刮路径/lib
/usr/lib
/usr/lib/libpos.so
默许的静态库搜刮路径/usr/lib
表1:程序pos输入了局和静态库的对应干系
创立各个静态库,并安排在响应的目次中。测试情况就筹办好了。实行程序pos,并在该命令行中设置情况变量LD_LIBRARY_PATH。
#LD_LIBRARY_PATH=/root/test/env/lib./pos
./
#
依据程序pos的输入了局可知,开始搜刮的是编译方针代码时指定的静态库搜刮路径。然后我们把静态库./libpos.so删除,再运转上述命令尝尝。
#rmlibpos.so
rm:removeregularfile`libpos.so"?y
#LD_LIBRARY_PATH=/root/test/env/lib./pos
/root/test/env/lib
#
依据程序pos的输入了局可知,第2个静态库搜刮的路径是情况变量LD_LIBRARY_PATH指定的。我们再把/root/test/env/lib/libpos.so删除,运转上述命令。
#rm/root/test/env/lib/libpos.so
rm:removeregularfile`/root/test/env/lib/libpos.so"?y
#LD_LIBRARY_PATH=/root/test/env/lib./pos
/root/test/conf/lib
#
第3个静态库的搜刮路径是设置文件/etc/ld.so.conf指定的路径。删除静态库/root/test/conf/lib/libpos.so后再运转上述命令。
#rm/root/test/conf/lib/libpos.so
rm:removeregularfile`/root/test/conf/lib/libpos.so"?y
#LD_LIBRARY_PATH=/root/test/env/lib./pos
/lib
#
第4个静态库的搜刮路径是默许搜刮路径/lib。我们再删除静态库/lib/libpos.so,运转上述命令。
#rm/lib/libpos.so
rm:removeregularfile`/lib/libpos.so"?y
#LD_LIBRARY_PATH=/root/test/env/lib./pos
/usr/lib
#
最初的静态库搜刮路径是默许搜刮路径/usr/lib。
综合以上了局可知,静态库的搜刮路径搜刮的前后按次是:
1.编译方针代码时指定的静态库搜刮路径;
2.情况变量LD_LIBRARY_PATH指定的静态库搜刮路径;
3.设置文件/etc/ld.so.conf中指定的静态库搜刮路径;
4.默许的静态库搜刮路径/lib;
5.默许的静态库搜刮路径/usr/lib。
在上述1、2、3指定静态库搜刮路径时,都可指定多个静态库搜刮路径,其搜刮的前后按次是按指定路径的前后按次搜刮的。对此本文不再举例申明,有乐趣的读者能够参照本文的办法考证。
来自:Linux静态库(.so)搜刮路径

买一本命令参考手册是必要的,遇到不知道怎么用的命令可以随时查询,这要比查man文档快.特别适合英语不好。
老尸 该用户已被删除
沙发
发表于 2015-1-21 13:39:29 | 只看该作者
直到学习Linux这门课以后,我才知道,原来我错了。?
活着的死人 该用户已被删除
板凳
发表于 2015-1-28 12:55:27 | 只看该作者
linux鸟哥的私房菜,第三版,基础篇,网上有pdf下的,看它的目录和每章的介绍就行了,这个绝对原创!
飘飘悠悠 该用户已被删除
地板
发表于 2015-2-1 19:51:39 | 只看该作者
Linux简单,占内存少,特别是对于程序开发人员来说很方便,如果说windows的成功在于其方便用户的窗口管理界面。
爱飞 该用户已被删除
5#
发表于 2015-2-7 14:42:22 | 只看该作者
然我们对Linux的学习首先是通过对它的产生,发展,到今天仍然在不断完善开始的。
不帅 该用户已被删除
6#
发表于 2015-2-11 07:48:45 | 只看该作者
另外Linux上也有很多的应用软件,安装运行了这些软件后,你就可以在Linux上编辑文档、图?片,玩游戏、上网、播放多媒体文件等。
分手快乐 该用户已被删除
7#
发表于 2015-2-12 23:48:24 | 只看该作者
感谢老师和同学们在学习上对我的帮助。
变相怪杰 该用户已被删除
8#
发表于 2015-3-3 11:17:35 | 只看该作者
上课传授的不仅仅是知识,更重要的是一些道理,包括一些做人的道理,讲课时也抓住重点,循序渐进,让同学理解很快;更可贵的是不以你过去的成绩看问题.
再见西城 该用户已被删除
9#
发表于 2015-3-11 10:19:47 | 只看该作者
学习Linux系统在服务中的配置方法及使用方法。Linux在服务器中应用相当广,应对常用的apache,samba,ftp等服务器基本配置清楚了解。[重点,应巩固学习]
若天明 该用户已被删除
10#
发表于 2015-3-18 04:35:53 | 只看该作者
众所周知,目前windows操作系统是主流,在以后相当长的时间内不会有太大的改变,其方便友好的图形界面吸引了众多的用户。
简单生活 该用户已被删除
11#
发表于 2015-3-25 11:33:12 | 只看该作者
查阅经典工具书和Howto,特别是Howto是全球数以万计的Linux、Unix的经验总结非常有参考价值通常40%的问题同样可以解决。
因胸联盟 该用户已被删除
12#
 楼主| 发表于 2015-3-27 19:32:36 | 只看该作者
老实说,第一个程序是在C中编译好的,调试好了才在Linux下运行,感觉用vi比较麻烦,因为有错了不能调试,只是提示错误。
第二个灵魂 该用户已被删除
13#
发表于 2015-4-11 12:16:36 | 只看该作者
Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。
admin 该用户已被删除
14#
发表于 2015-4-17 08:52:33 | 只看该作者
首先Linux是开源的,这也是最主要的原因,想学windows,Unix,对不起我们没源代码。也正是因为这样,Linux才能够像滚雪球一样越滚越大,发展到现在这种规模。
飘灵儿 该用户已被删除
15#
发表于 2015-4-19 14:00:29 | 只看该作者
得到到草率的回答或者根本得不到任何Linux答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。
16#
发表于 2015-4-23 22:14:26 | 只看该作者
目前全球有超过一百多个Linux发行版本,在国内也能找到十几个常见版本。如何选择请根据你的需求和能力,RedhatLinux和DebianLinux是网络管理员的理想选择。
小女巫 该用户已被删除
17#
发表于 2015-4-24 14:38:37 | 只看该作者
可以说自己收获很大,基本上完成了老师布置的任务,对于拔高的题目没有去做,因为我了解我的水平,没有时间和精力去做。?
蒙在股里 该用户已被删除
18#
发表于 2015-5-5 03:38:07 | 只看该作者
Linux简单,占内存少,特别是对于程序开发人员来说很方便,如果说windows的成功在于其方便用户的窗口管理界面。
谁可相欹 该用户已被删除
19#
发表于 2015-5-10 03:48:50 | 只看该作者
安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么。如果Linux说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 16:56

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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