Visual Studio:将依赖的 DLL 复制到目标文件夹
Posted
技术标签:
【中文标题】Visual Studio:将依赖的 DLL 复制到目标文件夹【英文标题】:Visual Studio: copy dependent DLLs to target folder 【发布时间】:2011-02-10 10:36:16 【问题描述】:我意识到这个问题以前曾被问过 - 但没有一个答案适用于我的具体案例:
我有一个包含本机 C++ EXE 项目的解决方案,该项目又依赖于 40 多个本机 C++ DLL 项目(在同一解决方案中)。
EXE 项目具有通常的 Debug、Release(和 Profile)配置,但由于它们的源代码库相同用于构建三个不同的应用程序(比如 A1、A2 和 A3)。此外,它针对 x32 和 x64,因此总共有 3 x 3 x 2 = 18 个项目配置。
DLL 项目由所有三个目标应用程序共享,因此只有 3 个(Debug、Release、Profile)乘以 2 (x32, x64) = 6 种配置。
由于 EXE 项目依赖于 DLL,因此每当修改 DLL 项目的相关输出时,都需要将其复制到其目标文件夹(或其子文件夹)。
您将如何处理 DLL 的更新?
每个 DLL 项目中的构建后操作不起作用(很好),因为它必须将 DLL 复制到 A1、A2 的相关输出文件夹 和 A3。输出文件夹中的任何更改都会导致必须修改 50 个 DLL 项目中的每个项目中的构建后操作。
我目前将 DLL 本身作为项目项添加到 EXE 项目中,并配置了自定义构建工具以将其复制到输出文件夹。但这需要我将每个 DLL 添加 6 次,所以我最终得到 6 x 50 = 300 个 DLL!
我真正需要的是像“复制本地”选项这样的东西,不幸的是它只适用于程序集。您是否建议简化此构建设置的解决方案?
【问题讨论】:
【参考方案1】:我要做的是将所有 DLL 放在一个文件夹中(特定于 Debug/Release 等),然后将它们复制回 EXE 的相应输出文件夹。
这只能通过两个动作来完成:
将所有DLL的输出目录设置为$(ConfigurationName)_$(PlatformShortName)
之类的文件夹
向 EXE 项目添加构建后操作,该操作适用于将 $(ConfigurationName)_$(PlatformShortName)\*.dll
复制到 $(TargetDir)
的所有配置
编辑
第二步出现问题,因为您的 EXE 的 $(ConfigurationName)
与您的 DLL 项目不同。不确定,但也许您可以有一种方法来推断相应的配置,以便您的所有 18 个配置仍然有一个构建后事件。这可能是一个新的 SO 问题:)
【讨论】:
太棒了!为什么我以前没有考虑过? 是的,我注意到了。但这是可以管理的 - 它只是意味着会有三个稍微不同的构建后操作。【参考方案2】:这适用于 VisualStudio 2019(也可能是以前的版本,但未尝试过)
我尝试了几种方法,这是最好的折衷方案:
复制到最终的目标文件夹(最重要的!) 复制到项目 bin 文件夹中 出现在 VS 项目视图中 可以有不同的 x64/x86 文件 可重命名(标签Link
)
编辑您的 *.vcxproj 文件并像其他任何内容一样添加此 ItemGroup
<ItemGroup>
<None Include="MyDllFolder\myDll.dll" CopyToOutputDirectory="PreserveNewest" Link="myDll.dll"/>
<!-- x86/x64 different dlls -->
<None Include="MyDllFolder\x86\myDll2_x86.dll" Link="myDll2_x86.dll">
<CopyToOutputDirectory Condition="$(PlatformTarget) == x86">PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="MyDllFolder\x64\myDll2_x64.dll" Link="myDll2_x64.dll">
<CopyToOutputDirectory Condition="$(PlatformTarget) == x64">PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
灵感来自Automatic copy files to output during application building
【讨论】:
以上是关于Visual Studio:将依赖的 DLL 复制到目标文件夹的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Visual Studio 将 DLL 文件复制到输出目录?
如何防止引用程序集的嵌入式依赖项被复制到Visual Studio中的输出文件夹?
在 Visual Studio 2013 中添加对您自己的 DLL 项目的依赖项/引用
visual studio2013如何查看exe或dll依赖于哪些dll depends