为什么DLL没有复制到输出目录?C++Visual Studio

Why is the DLL not copied to output directory? C++ Visual Studio

本文关键字:C++Visual Studio 输出 DLL 复制 为什么      更新时间:2023-10-16

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

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

这也是我很难找到的东西,但VS不会为您复制.dll。您必须通过创建后生成事件来告知它。查看XCOPY上的链接: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是较新版本时进行复制。

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

也许我错了,但我认为DLL需要在文件夹作为输出目录中的可执行文件。那到底发生了什么?

首先,DLL不是构建过程的一部分,这也是Visual Studio不处理DLL的原因之一。

话虽如此,Visual Studio不应该自动将DLL复制到可执行目录的另一个原因是,Visual Studio没有也不能假设这是您想要的DLL所在的位置。

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

动态链接库搜索顺序

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

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

正如另一个答案所建议的那样,这就是为什么您必须共同努力,告诉Visual Studio在构建后事件中该做什么。此外,即使在应用了生成后事件之后,VisualStudio仍然对DLL一无所知——它看到的只是一个copyxcopy命令。