仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3021|回复: 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-3-27 19:32:36 | 显示全部楼层
老实说,第一个程序是在C中编译好的,调试好了才在Linux下运行,感觉用vi比较麻烦,因为有错了不能调试,只是提示错误。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-7 01:35

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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