【问题标题】:Why is the DLL not copied to output directory? C++ Visual Studio为什么 DLL 没有复制到输出目录? C++ 视觉工作室
【发布时间】:2015-07-04 15:12:45
【问题描述】:

我设置了一个 c++ 项目以在 Visual Studio 中使用 DLL。该库有 .h .lib 和 .dll 文件。程序编译运行,成功使用库。 DLL 被放置在 source 的根目录中,而不是输出目录中。构建时,我希望将 DLL 从源代码复制到输出目录,但事实并非如此。我在输出目录中看到的只有 3 个类型的文件,应用程序、增量链接器文件和程序调试数据库。

也许我错了,但我认为 DLL 需要与输出目录中的可执行文件位于同一文件夹中。那到底是怎么回事?

【问题讨论】:

  • 尝试在VS之外启动程序,然后在同一目录中搜索。 VS 的许多奇怪之处之一。
  • @deviantfan 如果我通过单击输出目录中的应用程序在 VS 之外启动它,它将找不到 dll; /
  • 默认输出目录是 solution 目录,而不是项目构建目录。这可确保所有项目将其输出生成到同一目录,并且您的解决方案将起作用。这是一个可以更改的设置,常规页面。
  • @Ragdoll 是的,完全正确。因为VS没有把它放在同一个目录中。
  • @HansPassant 是的,输出目录在解决方案目录中,但我看不出这与谈论的内容有什么关系

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


【解决方案1】:

这也是我很难找到的东西,但是 VS 不会为你复制 .dll。您必须通过创建 Post-Build 事件来告诉它。查看 XCOPY 上的链接: https://support.microsoft.com/en-us/kb/240268

我需要将一些 dll 复制到我的目标目录(构建目录),因此在我的项目设置中的构建后事件中使用了以下内容:

xcopy $(ProjectDir)openal32.dll $(TargetDir) /Y /D

只需将“openal32.dll”替换为您需要复制的任何 dll,并为您需要复制到目标(构建)目录的每个 dll 创建一个新的构建事件。

/Y 禁止提示确认覆盖 /D 指示编译器仅在此构建上的 dll 的较新版本时复制。

【讨论】:

    【解决方案2】:

    当我构建时,我希望将 DLL 从源复制到 输出目录,但不是。

    也许我错了,但我认为 DLL 需要在同一个 文件夹作为输出目录中的可执行文件。那到底是怎么回事?

    首先,DLL 不是构建过程的一部分,这也是 Visual Studio 不对您的 DLL 做任何事情的原因之一。

    话虽如此,Visual Studio 不应自动将 DLL 复制到您的可执行目录的另一个原因是 Visual Studio 不会也不能假定这是您希望放置 DLL 的位置。

    它不能假设这一点,因为您可能希望将您的 DLL 放置在 Windows 操作系统在加载 DLL 时将找到的目录之一。看这个链接:

    Dynamic Link Library Search Order

    如果您正在测试您的应用程序,看看它是否会正确加载 DLL,如果它被放置在您的 PATH 上的某个目录中?如果 Visual Studio 总是将 DLL 复制到您的可执行目录,您将如何做到这一点?

    另一种情况:如果您的程序使用LoadLibrary 并且想要测试如果 DLL 找到程序是否正确运行,该怎么办?

    正如另一个答案所建议的,这就是为什么您必须齐心协力告诉 Visual Studio 在构建后事件中要做什么。此外,即使在应用构建后事件之后,Visual Studio 仍然对您的 DLL 一无所知——它所看到的只是 copyxcopy 命令。

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      相关资源
      最近更新 更多