Visual Studio:将相关的DLL复制到目标文件夹

时间:2011-02-10 10:36:17

标签: visual-studio-2010 build-process native

我意识到之前已经问过这个问题 - 但没有一个答案适用于我的具体案例:

  • 我有一个包含本机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!

我真正需要的是类似于复制本地选项,但不幸的是只能使用程序集。您是否建议简化此构建设置?

2 个答案:

答案 0 :(得分:5)

我要做的是将所有DLL放在一个文件夹中(特定于Debug / Release等),然后将它们复制回EXE的相应输出文件夹。

这只能在两个动作中完成:

  • 将所有DLL的输出目录设置为$(ConfigurationName)_$(PlatformShortName)

    等文件夹
    • 选择所有DLL项目
    • 右键单击 - > propoerties
    • 选择所有配置和所有平台
    • 设置输出目录
  • 向EXE项目添加构建后操作,对于将$(ConfigurationName)_$(PlatformShortName)\*.dll复制到$(TargetDir)

  • 的所有配置通用

修改

第二步中存在问题,因为EXE的$(ConfigurationName)与您的DLL项目不同。不确定,但也许你可以有一种方法来推断相应的配置,以便仍然为你的所有18个配置都有一个post-build事件。这可能是一个新的SO问题:)

答案 1 :(得分:0)

这适用于 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>

Visible dll file in the project

灵感来自Automatic copy files to output during application building