现在的位置: 首页 > 综合 > 正文

动态库的搜索路径

2018年07月10日 ⁄ 综合 ⁄ 共 1157字 ⁄ 字号 评论关闭

简单整理一下,备忘;只关注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.csdn.net/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= 是等价的写法

参考

抱歉!评论已关闭.