【问题标题】:Why can't Visual Studio find my DLL? [duplicate]为什么 Visual Studio 找不到我的 DLL? [复制]
【发布时间】:2011-06-24 15:23:27
【问题描述】:

在 Visual Studio 2010 中,在 VC++ Directories > Executable Directories 下,我指定了 glew32d.dll 的路径。但是,当我运行可执行文件时,它仍然会报错。

另一方面,如果我将 DLL 复制到本地文件夹并运行可执行文件,它不会报错。

谁能告诉我如何解决这个问题?另外,为什么 Visual Studio 无法识别该路径?

更新 场景:我目前使用一个模板项目,我用它作为我很多项目的起始代码。此模板依赖 glew32d.dll。我通常将所有依赖的 dll 存储在一个公共的 bin 文件夹中。我希望引用这个文件夹,Visual Studio 可以从那里读取 dll,而不必每次都复制 dll。有什么好的方法来处理这个问题?

【问题讨论】:

  • @muntoo:什么?另外,我不同意您编辑最后一行的方式。那里没有两个单独的问题,因此原始语法是正确的。鉴于 VS 无法识别路径,OP 正在询问他们如何解决此问题。他们关心 VS 不识别路径的唯一原因是因为它可能会引导他们找到解决方案。

标签: c++ visual-studio visual-studio-2010 visual-c++ dll


【解决方案1】:

在您的项目设置中指定 DLL 文件的路径并不能确保您的应用程序会在运行时找到 DLL。您只告诉 Visual Studio 如何找到它需要的文件。这与程序在构建后如何找到所需内容无关。

将 DLL 文件与可执行文件放在同一文件夹中是迄今为止最简单的解决方案。这就是依赖项的default search path,所以如果你走这条路,你不需要做任何特别的事情。
为避免每次都必须手动执行此操作,您可以为您的项目创建一个构建后事件,该事件会在构建完成后自动将 DLL 复制到相应的目录中。

或者,您可以将 DLL 部署到 Windows side-by-side cache,并将清单添加到指定位置的应用程序。

【讨论】:

  • 另一个“肮脏”的技巧是将程序的工作目录设置为glew32d.dll
  • 我有点困惑,“这与程序一旦构建后如何找到它需要的东西无关。”如果不是这样,那么“可执行目录”有什么用?另外,我用我目前的情况编辑了我的问题。请建议我什么是处理它的好方法。
  • @brainy:我不确定我的答案的哪一部分不清楚。 Visual Studio 链接器在构建 程序时使用指定的路径来查找所需的 DLL。这与您的程序运行 时所需要的不同。如果您选择静态链接到glew32d.dll,那将是另一回事。但是由于您是动态链接,因此编译的链接器步骤 AND 您的程序在执行时都需要能够定位 DLL。你已经解决了第一部分,但没有解决第二部分。根据您的更新,我认为最好的解决方案是复制 DLL 的构建后步骤。
  • 来吧...必须有一种方法让 VS 在运行时找到 DLL。在 VS2010 中,我找不到任何引用 DLL 的方法。它只是可以选择引用 sln 中的其他项目。 VS 如何在运行时从 Program Files 中找到它自己的 DLL?必须有办法。使用构建后事件有效,但依赖它似乎是错误的。应该有一种方法可以指定 dll 的路径以供运行时执行。有人知道怎么做吗?
  • @ruud DLL 应该与 EXE 位于同一目录中。您可以轻松地让 MsBuild 在构建时将它们转储到同一目录中,或者,如果失败,则将它们作为构建后事件复制到那里。依赖工作目录是非常脆弱的。如果用户创建了您的应用程序的快捷方式并将工作目录更改为其他内容会发生什么?繁荣,崩溃,找不到DLL。 EXE 目录位于 DLL 搜索顺序的顶部。工作目录位于底部。再高一点会带来巨大的安全风险。
【解决方案2】:

我在使用同一个库时遇到了同样的问题,在这里找到了解决方案 所以:

在 MSDN 中搜索“如何:为项目设置环境变量”。 (项目>属性>配置属性>调试 “环境”和“合并环境”属性 匆忙。)

语法为 NAME=VALUE 并且可以使用宏(例如, $(OutDir))。

例如,将 C:\Windows\Temp 添加到 PATH:

PATH=C:\WINDOWS\Temp;%PATH%

同样,将 $(TargetDir)\DLLS 附加到 PATH:

PATH=%PATH%;$(TargetDir)\DLLS

(此处由多重共线性回答:How do I set a path in visual studio?

【讨论】:

    【解决方案3】:

    尝试“配置属性 -> 调试 -> 环境”并在运行时设置 PATH 变量

    【讨论】:

      【解决方案4】:

      补充奥列格的答案:

      通过将 Visual Studio 的 $(ExecutablePath) 附加到配置属性->调试中的 PATH 环境变量,我能够在运行时找到 DLL。这个宏正是在配置属性->VC++ 目录->可执行目录字段*中定义的,所以如果你有这个设置来指向你需要的任何 DLL,只需将它添加到你的 PATH 中就可以在运行时轻松找到 DLL!

      * 我其实不知道$(ExecutablePath) 宏是使用项目的可执行目录设置还是全局属性页的可执行目录设置。由于我通过属性页配置了我经常使用的所有库,因此这些目录显示为我创建的任何新项目的默认值。

      【讨论】:

      • 正是我想要的,谢谢!
      猜你喜欢
      • 2021-04-23
      • 2023-03-30
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2023-03-12
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多