可执行文件链接动态库(dll)的一点猜想

本文探讨了在存在多个版本库的情况下,如Qt库A和B,百度exe如何按Path环境变量顺序加载动态库,以及当加载错误版本的dll时的行为。实验证明,即使先加载了错误版本的dll,系统也会继续搜索并最终使用正确的版本,同时卸载错误的dll。

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

百度exe加载动态库路径顺序,大致是这样的:

但是有一个问题,假如我装了两个版本的Qt库A和B,其dll路径都写在了环境变量Path中, 并且A在B的前面,那么我在使用B版本库编译的程序,运行时肯定是先搜寻Path中排在前面的路径下是否存在所需dll。那么无疑是先搜寻到A版本的dll,搜寻到了同名的dll,是否会停止继续搜寻,然后使用这个dll,发现版本不对,继而报错呢?

或者再直接一点,我将一个32位版本的dll放到一个64位的exe目录下,如下:

运行程序首先是搜寻到自身目录下这三个库,那么会不会报错呢?

经过实验不会报错,仍成功运行。

并且,在一个64位的项目中,运行程序结束后,注意到调试信息,C:\Program Files (x86)下的PCL是32位的,C:\Program Files下的PCL是64位的,exe先加载了32位的dll,然后紧接着又加载了64位的同名dll,之后将32位的dll都卸载了。

我的猜想是,exe按照Path中路径顺序搜寻dll,我电脑环境变量Path中的32位PCL路径是放在64位前面的,首先搜寻到32位的dll,加载,发现不是所需的,然后继续搜寻,又搜到一个同名dll,加载,发现这个是所需的,然后将不需要的卸载。

如果搜寻了所有路径,都没有找到正确版本的dll,此时才会报错。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HHT0506

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值