如何让Visual Studio将一个DLL文件复制到输出目录?

13 浏览
0 Comments

如何让Visual Studio将一个DLL文件复制到输出目录?

我有一个依赖于外部DLL文件的Visual Studio C++项目。在构建项目时,我该如何让Visual Studio自动将该DLL文件复制到输出目录(debug/release)中?

0
0 Comments

问题的原因是在使用Visual Studio时,需要将一个DLL文件复制到输出目录中,但是默认情况下Visual Studio不会自动复制该文件。解决方法是通过GUI界面或手动编辑项目文件来实现复制。

通过GUI界面的方法如下:

1. 将文件添加到项目中:右键点击项目,选择“添加”,然后选择“现有项”,浏览到要添加的文件并点击“添加”。

2. 告诉Visual Studio在构建时复制该文件:右键点击要复制的文件,选择“属性”。在属性列表中,找到“项类型”选项,将其改为“复制文件”。点击确定即可完成。

手动编辑项目文件的方法如下:

1. 打开项目的*.vcxproj文件。

2. 在文件中添加类似以下的代码:


    
    

或者使用更详细的代码:


    
        PreserveNewest
    
    
        PreserveNewest
    

以上方法中,使用标签来指定要复制的文件,并设置属性为“PreserveNewest”。

这种方法是正确的做法,因为DLL文件被包括在解决方案文件列表中,这样你就可以知道它们是否丢失。它允许你根据配置和平台复制不同的DLL文件,而且不需要手动编辑项目文件,也不依赖外部命令进行复制。

0
0 Comments

问题的出现的原因是需要将一个DLL文件复制到输出目录中,以便在项目构建完成后能够正确运行。

解决方法是使用项目的后期构建操作,在构建完成后添加复制DLL文件的命令。后期构建操作可以通过批处理脚本的形式来编写。

输出目录可以使用$(OutDir)进行引用,项目目录可以使用$(ProjDir)进行引用。尽量使用相对路径,这样即使移动项目文件夹,后期构建操作也不会出错。

还值得指出的是,可以通过Project > Properties > Build Events > Post-Build Event来设置后期构建事件。

以下是一个示例:eyeung003.blogspot.com/2009/11/…

如果链接失效,可以使用以下命令:xcopy /y "$(ProjectDir)*.dll" "$(OutDir)"

我将上述命令修改为我在实际项目中使用的方式。这将复制只读文件,这对于源代码控制是有益的,并且创建目标目录(通常不需要)。-> xcopy "$(ProjectDir)*.dll" "$(OutDir)" /i /r /y

在xcopy命令中添加/d标志,可以防止不必要地重新复制输出目录中未更改的文件。

使用$(TargetDir)而不是$(OutDir)

真的吗?我们必须创建一个自定义的构建事件才能将引用的.dll文件复制到输出文件夹中吗?我很惊讶我们不能只是将.dll文件设置为引用或将其包含在项目中,然后设置其属性或其他操作来复制。我们可以通过这种方式复制任何类型的内容,但不能复制.dll文件吗?无论如何,这真是糟糕透了。

需要注意的是,这个答案已经超过10年了,关于.dll文件方面可能已经发生了变化。

0
0 Comments

在使用Visual Studio 2013中,$(OutDir)被发现是一个相对路径,所以我不得不将它与$(ProjectDir)结合起来以达到期望的效果:

xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"

顺便说一句,你可以通过在脚本开头添加'echo '来轻松调试脚本,并观察生成输出窗口中的展开文本。

$(TargetDir)可以替代$(ProjectDir)$(OutDir),因为它们本来就是相互结合的。

在我的情况下,如果没有/d参数,它会抛出一个访问被拒绝的错误。但是根据文档,/d是用于日期的,不确定它与问题有什么关联。

添加/d参数可以防止覆盖,如果源文件比现有文件旧或相同。如果目标被另一个进程锁定,可能会出现访问被拒绝的错误。

我建议添加/f参数,如xcopy /y /f,以获取有关源目录和目标目录的详细输出。文档:learn.microsoft.com/en-us/windows-server/administration/…

0