【问题标题】:How can I change the .dll search path my application uses?如何更改我的应用程序使用的 .dll 搜索路径?
【发布时间】:2014-08-24 07:48:36
【问题描述】:

随着我的应用程序的增长,我发现自己使用的第三方库越来越多,而且我的应用程序目录中的 .dll 数量也在增长(撰写本文时为 11 个)。这本身并不是一个真正的问题,但它很丑陋。我更希望能够将这些放在“bin/”或其他内容中。

这可以做到吗,还是我把时间浪费在了一些无关紧要的事情上?

这将给我的唯一真正优势是我可以将 x86 和 x64 版本的 exe 放在同一目录中,并让它们从 dll 的适当文件夹中加载 (bin32/bin64/,例如)。

我正在使用 C++ 和 MinGW-W64。

【问题讨论】:

    标签: c++ dll mingw-w64


    【解决方案1】:

    您可以使用 GNU 链接器的 -rpath 标志。

    例如,这将在本地目录中搜索依赖的 dll:-Wl,-rpath,./

    所以特别是在你的情况下你想要:-Wl,-rpath,./bin

    【讨论】:

    • 当我在 code::blocks 中运行程序时,这对我有用,但当我在其他地方运行发布版本时,这对我有用。
    • “其他地方”?你在那里使用什么编译器或链接器?这是一个 GNU 链接器标志。当然,您必须在您使用的任何 Makefile 或构建配置中设置它。
    • 我的意思是,当我在 code::blocks 中工作并点击“运行”或“构建并运行”按钮时,它工作正常,将 dll 从bin/ 拉为想要的。当我创建发布版本并将可执行文件复制到桌面上的文件夹时,它会抱怨缺少 .dll,除非我将它们放在与可执行文件相同的目录中。
    • 你是否检查了依赖walker(或者如果你在linux上,则使用ldd)是否它正在寻找的所有文件都在那里并且在正确的目录中?你有没有在 IDE 项目中设置任何环境变量?
    • 我说得太早了,现在-Wl,-rpath,./bin 根本没有做任何事情,即使在 code::blocks 内也是如此。
    【解决方案2】:

    以下链接很好地解释了 DLL 搜索顺序。
    引用:

    在系统搜索 DLL 之前,它会检查以下内容:
    如果内存中已经加载了具有相同模块名称的DLL,则系统使用加载的DLL,无论它在哪个目录中。系统不会搜索该DLL。
    如果 DLL 在运行应用程序的 Windows 版本的已知 DLL 列表中,则系统使用其已知 DLL 的副本(以及已知 DLL 的依赖 DLL,如果有的话)。系统不搜索 DLL。
    有关当前系统上已知 DLL 的列表,请参阅以下注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs。

    您可以参考使用 SetDllDirectory 添加自定义搜索目录。

    Dynamic-Link Library Search Order on MSDN

    【讨论】:

    • 我不知道为什么这被否决了,看起来它包含一个正确的答案:调用SetDllDirectory(尽管似乎应该仔细阅读SetDllDirectory 的文档)。
    • 强烈建议不要在 SO 上使用仅链接的答案。
    • 对不起,添加了一些解释
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多