在Windows中加载共享库时在特定路径中采用dll
我正在使用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实际上不是一种选择,因为这是我们正在构建的第三方程序
按照时间顺序,Windows如何查找DLL在这里逐步解释
https://msdn.microsoft.com/en-us/library/7d83bc18.aspx
在上述链接的所有步骤之后,当谈到PATH环境变量时,windows将从左到右查看PATH变量中列出的每个目录。
首先尝试如果您可以将正确的DLL放置在上述链接中列出的任何位置。 因为路径环境变量是被查看的最后一件事情。
如果上面的步骤是不可能的,那么确保正确的DLL的路径是在PATH环境变量中的错误DLL路径的左侧 。
下面的文章为使用SetDllDirectory
和LoadLibraryEx
API调用来实现替代DLL搜索策略提供了一些指导,假设这些选项(您提到的是LoadLibrary
当前使用)。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx
事实证明,还有另一个名为LoadLibraryEx的窗口函数,它允许显式指定库将被加载的路径。 您可以在这里了解更多信息:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
具体来说,正如文件提到的那样:
如果使用此值并且lpFileName指定绝对路径,则系统将使用备注部分中讨论的备用文件搜索策略来查找指定模块导致加载的相关可执行模块。
和
如果lpFileName指定绝对路径并将dwFlags设置为LOAD_WITH_ALTERED_SEARCH_PATH,则LoadLibraryEx将使用更改后的搜索路径。
链接地址: http://www.djcxy.com/p/44507.html上一篇: Picking a dll in a particular path while loading a shared library in Windows
下一篇: Is it possible to set fixed DLL search path in VisualStudio application?