windows和Linux动态连接器搜索库文件(.dll/.so)目录的顺序

本文介绍了Windows系统中DLL文件及Linux系统中SO共享库的搜索加载顺序。Windows按照特定目录顺序查找DLL,而Linux则优先从缓存及默认路径如/lib开始搜索,之后检查LD_LIBRARY_PATH环境变量指定的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Windows按下列顺序搜索 DLL: 

  1. 可执行模块所在的目录。 GetMoudleFileName
  2. Windows 系统目录。GetSystemDirectory 函数检索此目录的路径。 
  3. Windows 目录。GetWindowsDirectory 函数检索此目录的路径。  
  4. 进程的当前目录。 GetCurrentDirectory
  5. PATH 环境变量中列出的目录。 GetEnvironmnetVariable

linux按下列顺序搜索.so:

  1. 缓存:动态链接器首先搜索已加载的共享库的缓存,以提高性能。

  2. 默认系统路径:动态链接器接下来会搜索一组默认的系统共享库路径,例如/lib/usr/lib。这些路径是系统安装的共享库的标准位置。

  3. LD_LIBRARY_PATH环境变量指定的路径:如果没有在默认系统路径中找到所需的共享库,动态链接器会检查LD_LIBRARY_PATH环境变量。LD_LIBRARY_PATH指定了一个或多个路径,动态链接器会按照它们的顺序搜索这些路径中的共享库。

所以,如果在默认系统路径(如/lib)和LD_LIBRARY_PATH环境变量指定的路径中都存在同名的共享库,动态链接器将会先找到并加载默认系统路径中的共享库,而不会在LD_LIBRARY_PATH指定的路径中搜索。

需要注意的是,为了避免潜在的冲突和问题,最好的做法是将共享库正确安装到系统的默认路径中,而不是依赖于LD_LIBRARY_PATH来指定自定义路径。LD_LIBRARY_PATH的使用应该限制在特定的情况下,例如在调试或开发过程中指定临时路径。

总结而言,动态链接器会先搜索默认的系统路径,然后才会搜索LD_LIBRARY_PATH环境变量指定的路径。因此,如果存在同名的共享库,优先加载的是默认系统路径中的共享库。




 

### Linux动态静态库的区别 #### 1. 定义与特性 静态库是以 `.a` 文件形式存在的预编译目标文件集合,通常用于在链接阶段将这些目标文件嵌入到最终可执行文件中[^2]。而动态库则是以 `.so` 文件形式存在,在程序运行时由动态链接加载并解析依赖关系[^2]。 #### 2. 链接方式 静态库在编译期间被完全复制到可执行文件内部,因此生成的二进制文件较大,但独立性强,无需额外依赖外部资源即可运行[^2]。相比之下,动态库仅记录其位置信息于可执行文件之中,实际代码并不包含其中,这使得最终产物体积更小却需要相应共享对象存在于系统特定路径下才能正常工作[^2]。 #### 3. 加载时机 当应用程序使用静态库构建时,所有必要的函数实现都会在构建过程中固定下来,并成为应用的一部分[^2]。对于采用动态库的应用来说,则是在启动或者调用某个功能模块之前才完成所需组件的实际装载操作——即所谓的延迟绑定机制发挥作用之时。 #### 4. 更新维护便利性 由于每次修改都需要重新创建整个项目来反映更改点,所以基于静态连接开发的产品后期调整起来相对麻烦一些[^2];然而通过更新单独版本号较高的SO文件就可以让多个利用相同基础逻辑的不同进程受益于此改进成果而不必逐一重做它们各自的部署包—这就是为什么现代软件倾向于更多地依靠DLs而不是SLs的原因之一. 以下是简单的CMake脚本展示如何分别定义这两种类型的库: ```cmake cmake_minimum_required (VERSION 3.5) project (demo) set (SRC_LIST ${PROJECT_SOURCE_DIR}/testFunc/testFunc.c) add_library (testFunc_shared SHARED ${SRC_LIST}) add_library (testFunc_static STATIC ${SRC_LIST}) set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc") set_target_properties (testFunc_static PROPERTIES OUTPUT_NAME "testFunc") set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) ``` 此段代码片段展示了如何在一个名为 `demo` 的工程里同时建立一个叫作 `testFunc` 的共享以及静态版库,并设置输出目录为项目的根级 `/lib` 下面[^3]。 #### 动态搜索路径优先级 值得注意的是,无论选择哪种类型的库进行项目搭建,如果涉及到.so文件的话还需要注意它的查找次序问题。一般而言会按照下面这个列表里的顺序依次尝试定位所需的DLL: - 编译目标代码时明确指出的位置; - 用户自定义环境变量 `LD_LIBRARY_PATH` 所指向的地方; - 系统全局配置文档 /etc/ld.so.conf 列举出来的区域再加上之后经由命令 ldconfig 处理后的缓存数据; - 常规保留的标准地址比如 /lib /usr/lib 。[^1] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值