我有一个依赖外部DLL文件的Visual Studio C ++项目。在构建项目时,如何让Visual Studio自动将此DLL文件复制到输出目录(调试/发布)?
答案 0 :(得分:87)
在项目中使用post-build操作,并添加命令以复制有问题的DLL。后构建操作是作为批处理脚本编写的。
输出目录可以引用为$(OutDir)
。项目目录以$(ProjDir)
的形式提供。尝试在适用的情况下使用相对路径,以便您可以复制或移动项目文件夹,而不会破坏构建后的操作。
答案 1 :(得分:36)
$(OutDir)在VS2013中是一个相对路径,所以我不得不将它与$(ProjectDir)结合起来以达到预期的效果:
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
顺便说一下,您可以通过添加“回声”来轻松调试脚本。在开头,观察构建输出窗口中的扩展文本。
答案 2 :(得分:7)
在尝试将输出dll从一个C ++项目复制到同一解决方案中另一个C#项目的release and debug文件夹时,上面注释部分中的详细信息对我(VS 2013)不起作用。
我必须添加以下post build-action(右键单击具有.dll输出的项目),然后 properties - >配置属性 - >构建事件 - >后期制作活动 - >命令行
现在我添加了这两行来将输出dll复制到两个文件夹中:
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
答案 3 :(得分:4)
(这个答案只适用于C#而不是C ++,抱歉我误读了原来的问题)
之前我已经通过DLL地狱了。我的最终解决方案是将非托管DLL作为二进制资源存储在托管DLL中,并在程序启动时将它们解压缩到临时文件夹中,并在处理完毕后将其删除。
这个应该成为.NET或pinvoke基础架构的一部分,因为它非常有用....它使您的托管DLL易于管理,无论是使用Xcopy还是作为Project引用更大的Visual Studio解决方案。完成此操作后,您不必担心构建后事件。
更新:
中发布了代码答案 4 :(得分:2)
在 project.csproj 文件中添加内置的COPY:
<Project>
...
<Target Name="AfterBuild">
<Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Debug\bin" SkipUnchangedFiles="false" />
<Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Release\bin" SkipUnchangedFiles="false" />
</Target>
</Project>
答案 5 :(得分:0)
xcopy /y /d "$(ProjectDir)External\*.dll" "$(TargetDir)"
您还可以参考相对路径,下一个示例将在项目文件夹上方一层的文件夹中找到DLL。如果您有多个在单个解决方案中使用DLL的项目,则将DLL的源设置为“启动项目”时,会将其放置在可访问的公共区域中。
xcopy /y /d "$(ProjectDir)..\External\*.dll" "$(TargetDir)"
/y
选项未经确认即会复制。
/d
选项检查目标文件中是否存在文件,以及是否仅在源文件的时间戳比目标文件新的情况下才复制文件。
我发现,在至少较新的Visual Studio版本(例如VS2109)中,$(ProjDir)
是未定义的,而必须使用$(ProjectDir)
。
在xcopy
中保留目标文件夹应默认为输出目录。理解原因$(OutDir)
本身并没有帮助。
$(OutDir)
(至少在最新版本的Visual Studio中)被定义为输出文件夹的相对路径,例如bin/x86/Debug
。单独使用它作为目标将从项目输出文件夹开始创建一组新文件夹。例如:… bin/x86/Debug/bin/x86/Debug
。
将其与项目文件夹结合在一起可以使您到达正确的位置。例如:$(ProjectDir)$(OutDir)
。
但是$(TargetDir)
将一步提供输出目录。
Microsoft's list of MSBuild macros for current and previous versions of Visual Studio
答案 6 :(得分:-1)
我有一个类似的问题。在我的项目中,有几个外部 DLL。所以我在项目中新建了一个名为“lib”的文件夹,并将所有外部dll复制到这个文件夹中。