我正在使用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实际上不是一种选择,因为这是我们正在构建的第三方程序
答案 0 :(得分:1)
这里按照时间顺序逐步解释了Windows如何查找DLL
https://msdn.microsoft.com/en-us/library/7d83bc18.aspx
完成上述链接的所有步骤后,当谈到PATH环境变量时,windows会从左到右查看PATH变量中列出的每个目录。
首先尝试将正确的DLL放在上面链接中列出的任何位置。因为路径环境变量是最后的事情。
如果无法执行上述步骤,请确保正确的DLL 路径位于错误的DLL 路径的左侧路径 PATH环境变量。
答案 1 :(得分:0)
以下文章提供了使用SetDllDirectory
和LoadLibraryEx
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使用更改的搜索 路径。