简单整理一下,备忘;只关注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= 是等价的写法
参考
- Windows 核心编程 19.2.3一节
- GCC: The Complete Reference 之 Chapter 12
-
http://msdn.microsoft.com/en-us/library/ms682586%28v=vs.85%29.aspx