一、Windows
详见 https://learn.microsoft.com/zh-cn/windows/win32/dlls/dynamic-link-library-search-order
在Windows 下,如果没有做任何操作的话。
XP 之后顺序为:
- 包含可执行文件的目录;
- Windows 的系统目录,该目录可通过GetSystemDirectory 得到;即 System32;
- 16位的系统目录,即Windows 目录的System 子目录;
- Windows 目录。 使用 GetWindowsDirectory 函数获取此目录的路径;
- 进程的当前目录;
- PATH 环境变量中列出的目录。
XP 之前顺序为:
- 包含可执行文件的目录;
- 进程的当前目录;
- Windows 的系统目录,该目录可通过GetSystemDirectory 得到;即 System32;
- 16位的系统目录,即Windows 目录的System 子目录;
- Windows 目录。 使用 GetWindowsDirectory 函数获取此目录的路径;
- PATH 环境变量中列出的目录。
XP 以后的搜索顺序主要目的是为了安全,让用户尽量控制住只使用自己的库和系统的库。默认情况下启用的安全 DLL 搜索模式, 若要禁用安全 DLL 搜索模式,需注册表中 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode 创建注册表值并将其设置为 0。
也可以通过调用 SetDllDirectory 函数,取消安全DLL 搜索模式。
当然,如果需要增加自己其它路径,则可以通过函数(AddDllDirectory)执行。
二、Linux
linux 程序运行时,.so 搜索路径如下:
- gcc 编译时指定的运行时库路径 -Wl,-rpath;
- 环境变量 LD_LIBRARY_PATH;
- ldconfig 缓存 /etc/ld.so.cache;
- 系统默认库位置 /lib /usr/lib