linux下链接库文件默认搜索路径

库文件包含静态库文件和动态库文件。

静态库就是在链接的时候加入到执行代码中,成为了代码的一部分,所以生成的可执行文件就比较大,以后和静态库没瓜葛了,自己随便用了;动态库是指运行的时候会链接到库文件,如果没找到就运行。

先介绍一下默认的库搜索路径,这些默认搜索路径是不分动态库和静态库的,都会在前面几个路径都找不到的情况来这儿找,所以这个是优先级最低的。

一般 Linux 系统把

/lib
/usr/lib
/usr/local/lib       (☆)

作为默认的库搜索路径,所以使用在这三个目录中的链接库文件可直接被搜索到。

这三个路径有什么区别?一般用哪个呢?怎么用呢?

很多应用都安装在/usr/local下面。我们可以看automake工具,定义的默认前缀就就是/usr/local。

Directory variable  Default value  
 
prefix  /usr/local  
 
exec_prefix   ${prefix}  
 
bindir  ${exec_prefix}/bin  
 
libdir  ${exec_prefix}/lib  
 
…  

因为,usr 指 Unix System Resource,/usr;/usr/bin目录包含所有的命令、程序库、文档和其它文件,我们可以移动到这个目录下,ls -al看下,都是系统预装的可执行程序,会随着系统的升级而改变,/usr/local/bin目录是给用户放置自己的可执行程序所以我们一般把我们可执行的脚本文件放到这个目录

使用方法:

方法一:直接拷贝到/usr/local/lib目录下;

方法二:你可以创建一个软连接到/usr/local/lib,这样就完成了映射,也是可以找到的。但是我想了想,万一删除了这个库文件呢?那创建的软连接不就失效了吗。。所以感觉拷贝靠谱点。

  • sudo ln -s//home/zss/桌面/network_programming/libyolanda.a /usr/lib/libyolanda.a
    #这里我没有用/usr/local/bin的原因是我当时还不知道两者的区别

 

静态库的搜索路径:

  • 优先级最高的就是直接在链接的时候添加路径

比如我们这里有一个静态库,叫“libtest.a”吧。你要通过gcc去链接的话就要写下面的指令:

gcc main.c -L. -ltest

就是说把main.c文件和libtest库链接起来,这里参数-Lpath,直接是连着一起写的,所以这里-L.就表示链接当前目录的xxx文件,当gcc看到-ltest的时候, 会自动去找去找libtest.a。(不过我个人觉得这种方法不好用,因为现在写一个大型项目,是不是都用 cmake了啊,makefile感觉也用的少了吧,不太懂。。以后好回来填坑吧啊)

  • 使用环境变量"LIBRARY_PATH"指定链接库搜寻路径
#方法一:
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:XXXX
# ":"是分割路径的,后面xxxx表示库所在的路径,表示新加了xxxx搜索路径
#缺点,这只是临时添加,下次开机就没了~

#方法二:
#首先找到你的配置文件.bashrc,你可以用locate .bashrc
locate .bashrc

#其次在打开这个文件
vim /home/zss/.bashrc

#把刚刚的路径添加一遍
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:XXXX

#这样的话,每次开机 ,.bashrc都会运行一遍,所以就又把这个XXXX路径给加进去了 
  •  使用ld连接脚本中的 “SEARCH_DIR” 指定链接库搜寻路径

使用“ld –verbose”命令查看gcc的默认链接脚本中SEARCH_DIR参数,拷贝libsay.so到SEARCH_DIR指定路径。

(这种方法我没用过)

SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/lib/x86_64-linux-gnu");
SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/local/lib64");
SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/local/lib");
SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64");
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib");
  • 最后一种就是一开始就说的默认搜索路径。目前我是觉得直接拷贝到那里蛮好的!

 

动态库的搜索路径:

  • 优先级最高的是编译时指定的动态库搜索路径
gcc –Wl,-rpath=.
#选项–Wl,-rpath 以及 =来指定搜索路径

同样感觉用的比较少,因为自己现在还没有涉及到动态库的链接,往往都是简短的代码链接一个静态库。

  • 环境变量LD_LIBRARY_PATH指定动态库的搜索路径。

这里可以去参考静态库的,一模一样。

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

首先打开这个文件,跑到文件最后添加你动态库的绝对路径,然后idconfig修改生效都可以了。

  • 最后就是默认的库搜索路径了,就是一开始提到的三个。

 

关于《后台开发核心技术与应用实践》书中第127页关于动态链接知识点,有一个题目,当时自己一直没懂,今天参考别人文章的时候想到了别人为什么这样解决。

题目:错误提示找不到动态库文件libmymath.so

解决步骤:

cp libmymath.so /usr/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib
sudo idconfig

 有一点要特别注意,export LD_LIBRARY_PATH=...,这个等号是要直接接在PATH后面的,千万不能打空格,否者会显示command not found。还有就是我的疑惑在,既然已经把动态库拷贝到目录文件下,为啥还要在环境变量LD_LIBRARY_PATH中添加/usr/lib吗?这不是多此一举吗?后来我想到动态库的搜索路径也是有顺序的,既然是动态库,在运行时期链接,肯定是希望越快越好,所以我们再添加到LD_LIBRARY_PATH中,让编译器能更快的找到。不过这个全局变量也许会带来一定危害吧!汗。在下文中提到了。不深究可以不看了 。

引文:https://blog.csdn.net/beizhengren/article/details/77978949

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 动态搜索路径是指在 Linux 系统下,动态链接器(ld)搜索和加载共享(.so),按照一定的优先级和搜索路径查找目标共享的过程。 在 Linux ,系统动态共享的存放路径一般有如下几个: 1. /usr/lib:系统提供的共享路径,一些常用的共享会被安装在该目录下。 2. /lib:系统提供的另一个共享路径,类似于 /usr/lib,但一些重要的共享会被安装在该目录下,这些通常是系统引导过程需要的。 3. LD_LIBRARY_PATH 环境变量:如果设置了该环境变量,ld 将会在其所指定的路径查找共享,而不是在默认路径查找。 4. /etc/ld.so.conf 文件:该文件指定了需要搜索的共享路径,如果没有指定,ld 会使用默认路径搜索共享。 5. /etc/ld.so.cache 文件:该文件记录了系统已经安装的共享和其路径信息,ld 可以通过该文件快速查找共享,避免搜索的性能损失。 在进行动态共享链接,系统动态链接器会按照以上搜索路径的优先级从上至下查找目标共享。如果要修改默认的动态搜索路径,可以在 /etc/ld.so.conf 添加自定义路径,并运行 ldconfig 命令更新缓存信息。 总之,动态搜索路径Linux 下非常重要的概念,对于程序员和系统管理员而言,了解动态搜索路径有助于更好地管理系统共享,提高应用程序的可用性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值