在Windows中加载共享库时在特定路径中拾取dll

时间:2017-03-31 04:47:56

标签: c++ windows dll g++ mingw

我正在使用MinGW创建一个使用LoadLibrary函数动态链接和加载的共享库。我的共享库依赖于可以在路径上的两个不同位置找到的dll。这两个是不同的(两个不同的版本),并在加载库时,它选择了错误的DLL。如何明确指定要选择的dll?

更具体地说,这些是我正在使用的命令:

汇编

g++ -m64 -O3 -c my_file.cpp -o myfile.o

创建共享库

g++ -m64 -shared myfile.o -o myfile.dll

我尝试了很多东西,包括-L选项,但还没有弄清楚如何做到这一点。我也在网上搜索了几个小时,但结果证明没用。

非常感谢任何帮助。

提前致谢

事实证明,我不想加载的dll确实位于"当前进程的可执行模块所在的目录。"另一个具有相同名称的dll位于路径上,但不是Windows首先查找的位置。根据本文档的说法,LoadLibrary将始终从当前进程的可执行模块所在的目录中选择dll,如果dll存在,则无论如何。有没有解决的办法?移动dll实际上不是一种选择,因为这是我们正在构建的第三方程序

3 个答案:

答案 0 :(得分:1)

这里按照时间顺序逐步解释了Windows如何查找DLL

https://msdn.microsoft.com/en-us/library/7d83bc18.aspx

完成上述链接的所有步骤后,当谈到PATH环境变量时,windows会从左到右查看PATH变量中列出的每个目录。

首先尝试将正确的DLL放在上面链接中列出的任何位置。因为路径环境变量是最后的事情。

如果无法执行上述步骤,请确保正确的DLL 路径位于错误的DLL 路径的左侧路径 PATH环境变量

答案 1 :(得分:0)

以下文章提供了使用SetDllDirectoryLoadLibraryEx API调用实现备用DLL搜索策略的一些指导,假设这些是选项(您提到当前使用LoadLibrary)。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx

答案 2 :(得分:0)

事实证明,还有另一个名为LoadLibraryEx的Windows函数,它允许显式指定库加载的路径。您可以在此处了解更多信息:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx

具体来说,正如文件中提到的那样:

  

如果使用此值并且lpFileName指定绝对路径,则   系统使用中讨论的备用文件搜索策略   备注部分找到相关的可执行模块   指定的模块导致加载。

  

如果lpFileName指定绝对路径并且dwFlags设置为   LOAD_WITH_ALTERED_SEARCH_PATH,LoadLibraryEx使用更改的搜索   路径。