动态库的搜索路径

简单整理一下,备忘;只关注Linux和Windows,其他情况不了解。dbzhang800 20110617

Windows

Windows下动态的库的搜索顺序,MSDN Dynamic-Link Library Search Order 中有详细的介绍。我们此处只关注比较正统的搜索顺序:

  • 包含可执行文件的目录
  • Windows的系统目录 (该目录可通过GetSystemDirectory得到)

  • 16位的系统目录 (即Windows目录下的system子目录)
  • Windows 目录 (该目录可通过GetWindowsDirectory得到)

  • 进行的当前工作目录
  • PATH环境变量中所列出的目录

注:工作目录位于Windows目录之后,这一改变始于 Windows Xp SP2.

Linux

注意:本部分内容不完全,如果你确实对此感兴趣,请考虑移步:http://blog.youkuaiyun.com/dbzhang800/article/details/6918413

动态库常规的搜索路径:

  • 程序构建时通过 RPATH 指定的目录
  • LD_LIBRARY_PATH 环境变量中冒号分割的目录
  • 文件 /etc/ld.so.cache列出的库(使用工具ldconfig维护)

  • 程序构建时 RUNPATH 指定的目录(fix me)
  • 目录 /lib

  • 目录 /usr/lib

注:RPATH似乎是很有争议的一个东西RpathIssue

ORIGIN

尽管有争议,我们还是可以想windows下一样,让程序从它所在的路径下加载动态库。

  • 直接调用编译器,使用 -Wl,-R,'$ORIGIN'

g++ hello.cpp -lmylib -Wl,-R,'$ORIGIN' -o hello
  • 编写makefile的话,使用 -Wl,-R,'$$ORIGIN'

all:
        g++ hello.cpp -lmylib -Wl,-R,'$$ORIGIN' -o hello
  • 使用qmake的话,我们需要在pro文件内添加
unix:!mac:QMAKE_LFLAGS += -Wl,--rpath=///$/$ORIGIN

-R后跟路径和--rpath= 是等价的写法

参考

 

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、付费专栏及课程。

余额充值