Linux动态库(.so)搜索路径

news/2024/7/10 3:38:19 标签: linux, library, path, file, object, gcc
 

动态库的搜索路径搜索的先后顺序是:

  1.编译目标代码时指定的动态库搜索路径;

  2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

  3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

  4.默认的动态库搜索路径/lib;

  5.默认的动态库搜索路径/usr/lib。

  在上述1、2、3指定动态库搜索路径时,都可指定多个动态库搜索路径,其搜索的先后顺序是按指定路径的先后顺序搜索的。

 如何知道一个可执行程序依赖哪些库
ldd命令可以查看一个可执行程序依赖的共享库,
例如# ldd /bin/lnlibc.so.6
=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
=> /lib/ld- linux.so.2 (0×40000000)

 

Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该 动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函数,以及该动态库的其它资源了。在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定。

  方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。

可以通过编辑配置文件/etc/ld.so.conf来指定动态库的搜索路径,该文件中每行为一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。

 

然后把库文件移动到目录/root/test/conf/lib中。

  # mkdir -p /root/test/conf/lib

  # mv libpos.so /root/test/conf/lib

  #

  最后编辑配置文件/etc/ld.so.conf,在该文件中追加一行"/root/test/conf/lib"。

  运行程序pos试试。

  # ./pos

  ./pos: error while loading shared libraries: libpos.so: cannot open shared object file: No such file or directory

  #

  出错了,系统未找到动态库libpos.so。找找原因,原来在编辑完配置文件/etc/ld.so.conf后,没有运行命令ldconfig,所以刚才的修改还未生效。我们运行ldconfig后再试试。

  # ldconfig

  # ./pos

  /root/test/conf/lib

  #

  程序pos运行成功,并且打印出正确结果。

 

方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。

  通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔。

 

我们可以使用export来设置该环境变量,在设置该环境变量后所有的命令中,该环境变量都有效。

  例如:

  # export LD_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所示)。当指定多个动态库搜索路径时,路径之间用冒号":"分隔。

 

以上介绍了三种指定动态库搜索路径的方法,加上默认的动态库搜索路径/lib和/usr/lib,共五种动态库的搜索路径。


http://www.niftyadmin.cn/n/1535456.html

相关文章

Qt从零开始制作串口调试助手-(第五章、创建资源文件,并添加图片到“关于界面”)-Creator_Ly

第五章、创建资源文件,并添加图片到“关于界面” 1、右击项目,选择添加新文件 2、选择Qt,Qt资源文件,点击选择 3、填写文件名,点击下一步。 4、点击完成 5、点击添加->添加前缀 6、更改前缀名称为/images 7、在E:\Q…

Atl Com组件DLL非注册调用

1:包含头文件: 、#include “../ATLcomMfc/ATLcomMfc_i.h” 、#include “../ATLcomMfc/ATLcomMfc_i.c” 可不引入: “../ATLcomMfc/ATLcomMfc_i.c” ;那样在使用CLSID_Student, IID_IStudent需要替换为&#xff1a…

Qt从零开始制作串口调试助手-(第六章、添加主界面调用子界面响应)-Creator_Ly

第六章、添加主界面调用子界面响应 1、打开mainwindow.h,添加串口和关于子界面的头文件。 2、对子界面进行对象声明。 3、窗口资源初始化。 4、mainwindow.cpp建立信号槽,将主菜单关联到信号槽中。 5、在mainwindow.h中添加声明。 6、在mainwindow.cpp中…

javascript获取querystring值【个人觉得这种方法最好最棒最像.NET】

原文发布时间为&#xff1a;2009-05-22 —— 来源于本人的百度文章 [由搬家工具导入]JavaScript获取QueryString值&#xff0c; 当没有QueryString值时输出bool型 null 用javascript接收QueryString声明一个queryString函数<script type"text/javascript">Requ…

JavaScript日历控件!JS兼容IE6.7.FF.可挡住下拉控件

原文发布时间为&#xff1a;2009-08-22 —— 来源于本人的百度文章 [由搬家工具导入]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www…

如何: 如何提供自己 DllMain MFC 的规则 DLL 中

概要 按照设计&#xff0c;MFC 的规则 Dll 具有 MFC 将自动提供一个默认 DllMain 函数。规则 Dll 不应提供自己 DllMain。应在规则 DLL 中的一个 CWinApp 派生类的 InitInstance 成员函数 DLL 加载时需要的任何初始化。取消初始化和终止代码应放在 ExitInstance 成员函数中。 …

Qt从零开始制作串口调试助手-(第七章、设置窗口标题(中文)和图标)-Creator_Ly

第七章、设置窗口标题&#xff08;中文&#xff09;和图标 1、设置窗口标题&#xff1a; ㈠、用setWindowTitle函数即可添加英文标题&#xff0c;如下&#xff1a; ⑵、但是当把英文标题直接换成中文时&#xff0c;则会出现乱码&#xff0c;如下&#xff1a; 这是由于不同的编…

如果程序出现Segment fault错误,该如何排错?谈SIGBUS和SIGSEGV

2010年网易有道的一道考基础知识的面试题&#xff0c;如果程序出现Segment fault错误&#xff0c;该如何排错&#xff1f;那么&#xff0c;什么是Segment fault&#xff1f;这里笔者引用一篇文章&#xff0c;说的很清楚。 SIGBUS和SIGSEGV也许是我们在平时遇到的次数最多的两个…