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个指定的动态库搜索路径中,可以指定多个动态库搜索路径。搜索顺序是按指定路径的顺序进行搜索的,本文没有说明这篇文章,感兴趣的读者可以通过本文的方法加以验证。