为什么 DLL 没有复制到输出目录? C++ Visual Studio
Why is the DLL not copied to output directory? C++ Visual Studio
我建立了一个 c++ 项目来使用 visual studio 中的 DLL。该库有 .h .lib 和 .dll 文件。程序编译运行,成功使用库。 DLL 被放在 source 的根目录,而不是输出目录。当我构建时,我希望将 DLL 从源复制到输出目录,但事实并非如此。我在输出目录中看到的是类型、应用程序、增量链接器文件和程序调试数据库3个文件。
也许我错了,但我认为 DLL 需要与输出目录中的可执行文件位于同一文件夹中。那么这是怎么回事?
这也是我很难找到的东西,但 VS 不会为您复制 .dll。您必须通过创建 Post-Build 事件来告诉它。查看 XCOPY 上的 link:
https://support.microsoft.com/en-us/kb/240268
我需要将一些 dll 复制到我的目标目录(构建目录),因此在我的项目设置的 Post-Build 事件中使用了以下内容:
xcopy $(ProjectDir)openal32.dll $(TargetDir) /Y /D
只需将 "openal32.dll" 替换为您需要复制的任何 dll,并为每个需要复制到目标(构建)目录的 dll 创建一个新的构建事件。
/Y 禁止提示确认覆盖
/D 指示编译器仅在该版本上是更新版本的 dll 时才进行复制。
When I build, I expected the DLL to be copied form the source to the
output directory, but it's not.
Maybe I'm wrong but I thought that the DLL needed to be in the same
folder as the executable in the output directory. So what's going on?
首先,DLL 不是构建过程的一部分,这就是为什么 Visual Studio 不对您的 DLL 做任何事情的原因之一。
话虽如此,Visual Studio 不应自动将 DLL 复制到您的可执行目录的另一个原因是 Visual Studio 不会也不能假定这是您要放置 DLL 的位置.
它不能假定这一点,因为您可能希望将 DLL 放置在 Windows OS 将在加载 DLL 时找到的目录之一。看到这个 link:
Dynamic Link Library Search Order
如果您正在测试您的应用程序,看看如果它被放置在您的 PATH 上的某个目录中,它是否会正确加载 DLL,该怎么办?如果 Visual Studio 总是将 DLL 复制到您的可执行目录,您将如何做到这一点?
另一种情况:如果您的程序使用 LoadLibrary
并且想要测试程序是否在 未找到 的情况下正确运行怎么办?
正如其他答案所建议的那样,这就是为什么您必须齐心协力告诉 Visual Studio 在 post 构建事件中要做什么。此外,即使在应用了 post 构建事件之后,Visual Studio 仍然对您的 DLL 一无所知——它所看到的只是一个 copy
或 xcopy
命令。
我建立了一个 c++ 项目来使用 visual studio 中的 DLL。该库有 .h .lib 和 .dll 文件。程序编译运行,成功使用库。 DLL 被放在 source 的根目录,而不是输出目录。当我构建时,我希望将 DLL 从源复制到输出目录,但事实并非如此。我在输出目录中看到的是类型、应用程序、增量链接器文件和程序调试数据库3个文件。
也许我错了,但我认为 DLL 需要与输出目录中的可执行文件位于同一文件夹中。那么这是怎么回事?
这也是我很难找到的东西,但 VS 不会为您复制 .dll。您必须通过创建 Post-Build 事件来告诉它。查看 XCOPY 上的 link: https://support.microsoft.com/en-us/kb/240268
我需要将一些 dll 复制到我的目标目录(构建目录),因此在我的项目设置的 Post-Build 事件中使用了以下内容:
xcopy $(ProjectDir)openal32.dll $(TargetDir) /Y /D
只需将 "openal32.dll" 替换为您需要复制的任何 dll,并为每个需要复制到目标(构建)目录的 dll 创建一个新的构建事件。
/Y 禁止提示确认覆盖 /D 指示编译器仅在该版本上是更新版本的 dll 时才进行复制。
When I build, I expected the DLL to be copied form the source to the output directory, but it's not.
Maybe I'm wrong but I thought that the DLL needed to be in the same folder as the executable in the output directory. So what's going on?
首先,DLL 不是构建过程的一部分,这就是为什么 Visual Studio 不对您的 DLL 做任何事情的原因之一。
话虽如此,Visual Studio 不应自动将 DLL 复制到您的可执行目录的另一个原因是 Visual Studio 不会也不能假定这是您要放置 DLL 的位置.
它不能假定这一点,因为您可能希望将 DLL 放置在 Windows OS 将在加载 DLL 时找到的目录之一。看到这个 link:
Dynamic Link Library Search Order
如果您正在测试您的应用程序,看看如果它被放置在您的 PATH 上的某个目录中,它是否会正确加载 DLL,该怎么办?如果 Visual Studio 总是将 DLL 复制到您的可执行目录,您将如何做到这一点?
另一种情况:如果您的程序使用 LoadLibrary
并且想要测试程序是否在 未找到 的情况下正确运行怎么办?
正如其他答案所建议的那样,这就是为什么您必须齐心协力告诉 Visual Studio 在 post 构建事件中要做什么。此外,即使在应用了 post 构建事件之后,Visual Studio 仍然对您的 DLL 一无所知——它所看到的只是一个 copy
或 xcopy
命令。