Linux动态库(SO)搜索路径的三种方法
众所周知,Linux动态库的默认搜索路径 / / usr / lib和lib.when动态库的创建,它一般是复制到两个目录。当程序执行一个动态库,以及动态库没有被加载到内存中,系统会自动这两个默认的搜索路径找到相应的动态库文件,然后将文件加载到内存,程序可以使用库的动态功能,和其他资源的动态库。在Linux,该动态库的搜索路径,可以通过以下三种方法指定,除了默认的搜索路径。方法1:在配置文件/ etc / ld.so.conf指定动态库搜索路径。
一个动态库搜索路径可以通过编辑配置文件中指定, / / ld.so.conf等,在进行一个动态库搜索路径。每次你编辑文件,你要运行的命令要想使修改后的配置有效的。我们举例说明这种方法的例子1。
例1:
我们使用下面的命令来创建一个动态库的源程序pos_conf libpos.so C(见程序1)。有关详细的创建过程,请参阅文本{ 1 }。
# gcc的C C pos_conf。
GCC -共享-联邦处罚和改造制度libpos.so pos_conf O O #。
#
#包括
无效词性()
{
printf( / / /根试验libn conf / );
}
方案1:pos_conf C。
下面的命令,然后由主编译。C(见程序2)生成目标程序的位置
GCC O POS主要。C组构# L.
#
无效词性();
主()
{
词性();
返回0;
}
方案2:主C。
然后将库文件到目录 / / /根/ lib中测试。
# mkdir -p / / /根/ lib中测试
# MV libpos.so / / /根/ lib中测试
#
最后,编辑配置文件 / / ld.so.conf等,并添加一行 / / /中根测试 / lib文件。
运行程序的位置
#。 / POS
。 / POS:加载共享库时出错:libpos.so:不能打开共享对象文件:
#
错误,系统没有找到动态库libpos.so.looking的原因,原来,在编辑配置文件/ etc / ld.so.conf,没有命令要想运行,所以变化就没有生效。让我们试试后我们要想跑。
要想#
#。 / POS
/ / /根/ lib中测试
#
程序POS成功运行并打印正确的结果。
方法二:指定动态库搜索路径的环境变量ld_library_path。
动态库的搜索路径也可以通过设置环境变量ld_library_path.when指定多个动态库搜索路径的环境变量指定的路径,结肠之间:分离。这种方法解释下面的例子2。
例2:
我们使用下面的命令来创建一个动态库的源程序pos_env libpos.so C(见程序3)。
# gcc的C C pos_env。
GCC -共享-联邦处罚和改造制度libpos.so pos_env O O #。
#
#包括
无效词性()
{
printf( / / /环境测试根/ libn );
}
方案3:pos_env C。
测试中使用的可执行文件的POS可以使用例1中得到的目标程序后不需要重新编译,因为pos_conf。C函数在POS和pos_env。C功能的POS功能原型和动态一致性,这是同一个名字,修改POS动态库的再创造同一个图书馆之后。这也是一个使用动态库的优点。
然后动态库libpos.so移至目录 / / /根/ lib中测试。
# mkdir -p / / /环境测试根 / lib
# MV libpos.so / / /环境测试根 / lib
#
我们可以使用导出设置环境变量。在设置环境变量之后的所有命令中,环境变量是有效的。
例如:
#出口ld_library_path = / / /环境测试根 / lib
#
但是为了举例,本文使用另一种方法来设置环境变量。它在命令之前设置环境变量。环境变量仅对命令有效。执行命令时,环境变量无效:
# ld_library_path = / / /环境测试根 / / POS库。
根目录
#
程序POS运行成功,并打印结果是 / / /环境测试根 / lib所以动态库,程序POS搜索是 / / /环境测试根 / / libpos.so lib。
方法三:在编译目标代码时指定程序的动态库搜索路径。
它也可以指定程序的动态库搜索路径时,目标代码编译。这是由GCC参数- Wl -路径,(如例3所示)。指定多个动态库搜索路径时,路径的结肠之间:分离。
例3:
我们使用下面的命令来创建一个动态库的源程序pos.c libpos.so(见程序4)。
# gcc的C pos.c
GCC -共享-联邦处罚和改造制度- O libpos.so pos.o #
#
#包括
无效词性()
{
printf(, / );
}
方案4:pos.c
因为我们需要指定的可执行文件的动态库搜索路径时,编译的目标代码,所以我们需要重新编译源代码,C(见程序2)用gcc命令来生成可执行文件的位置
GCC O POS主要。C L - LPOS # -西城,-路径。
#
再次运行程序POS。
#。 / POS
。
#
程序POS成功运行,并输出结果是在pos.c.so说程序POS搜索是动态库的功能POS的结果。/ libpos.so。
介绍了以上三种方法用于指定动态库搜索路径,加上默认的动态库搜索路径 / / usr /自由和自由,这五种动态库搜索路径。搜索顺序是什么
在上述三种方法的介绍,动态库。 / / / libpos.so,根测试 / / / libpos.so env基因库和 /根/测试/会议/自由/ libpos.so分别建立了。我们使用的源程序pos_lib。C(见程序5)来创建动态库/ lib / libpos.so,使用源pos_usrlib。C(见程序6)创建动态库/ usr /自由/ libpos.so。
#包括
无效词性()
{
printf( / libn );
}
方案5:pos_lib C。
#包括
无效词性()
{
printf(/ usr / libn );
}
方案6:pos_usrlib C。
这样,我们得到五个动态库,libpos.so,谁的名字都一样,它们都包含相同的函数原型的共同功能的POS,但存储的位置不同于公共功能的POS打印的结果。在每一个动态库的公共功能的POS机输出的位置动态库是存储。所以我们可以通过在可执行文件的POS 3例实施,得到不同的结果,动态库的搜索,从而获得第一名的动态链接库的搜索命令,然后删除该动态库,然后执行程序的POS机,二动态库的搜索路径,并然后将第二动态库中搜索等等,奥德R将是Linux动态库搜索,由程序POS和被搜索的动态库执行的输出结果之间的对应关系如表1所示。
程序输出结果
使用的动态库
相应的动态库搜索路径指定
。
libpos.so /。
在编译目标代码时指定的动态库搜索路径。
根目录
/ / /环境测试根 / / libpos.so lib
动态库的搜索路径的环境变量指定的ld_library_path
/ / /根/ lib中测试
/ / /中根测试 / lib / libpos.so
动态库的搜索路径配置文件 / / ld.so.conf指定等
/ lib
/ / libpos.so lib
默认动态库搜索路径
/ usr / lib
/ usr /自由/ libpos.so
默认的动态库搜索路径 / usr / lib
表1:程序POS输出结果和动态库的对应关系
在相应的目录中创建的每个动态库放。测试环境准备。执行程序的POS和命令行设置环境变量ld_library_path。
# ld_library_path = / / /环境测试根 / / POS库。
。
#
根据程序的POS输出,首先寻找的是动态库的搜索路径是指定在目标代码编译,然后删除该动态库。 / libpos.so,然后运行上述命令的尝试。
# RM libpos.so
Rm:删除普通文件` libpos。so'y
# ld_library_path = / / /环境测试根 / / POS库。
根目录
#
根据程序的POS输出,第二动态库的搜索路径是由环境变量指定的ld_library_path。让我们删除 / / /环境测试根/自由/ libpos.so再次运行上面的命令。
# RM / / /环境测试根 / / libpos.so lib
Rm:删除普通文件` / / /环境测试根/自由/ libpos。so'y
# ld_library_path = / / /环境测试根 / / POS库。
/ / /根/ lib中测试
#
第三种动态库的搜索路径是由指定的配置文件/ etc / ld.so.conf.delete动态库 / / /中根测试 / lib / libpos.so和运行上面的命令。
# RM / / /中根测试 / lib / libpos.so
Rm:删除普通文件` / / /中根测试 / lib / libpos。so'y
# ld_library_path = / / /环境测试根 / / POS库。
/ lib
#
第四种动态库的搜索路径是默认的搜索路径 / lib.we然后删除动态库/ lib / libpos.so运行上述命令。
# RM / / libpos.so lib
Rm:删除普通文件` / / libpos so'y库。
# ld_library_path = / / /环境测试根 / / POS库。
/ usr / lib
#
最后的动态库搜索路径是默认的搜索路径 / usr / lib。
基于上述结果,动态库中的搜索路径搜索顺序为:
1。在编译目标代码时指定动态库搜索路径;
2。动态库的搜索路径的环境变量指定的ld_library_path;
三.动态库的搜索路径的配置文件 / / ld.so.conf指定等;
4。默认动态库搜索路径;
5。默认的动态库搜索路径 / usr / lib。
在上面的1, 2个和3个指定的动态库搜索路径中,可以指定多个动态库搜索路径。搜索顺序是按指定路径的顺序进行搜索的,本文没有说明这篇文章,感兴趣的读者可以通过本文的方法加以验证。