【问题标题】:Visual Studio: copy dependent DLLs to target folderVisual Studio:将依赖的 DLL 复制到目标文件夹
【发布时间】:2011-02-10 10:36:16
【问题描述】:

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

  • 我有一个包含本机 C++ EXE 项目的解决方案,该项目又依赖于 40 多个本机 C++ DLL 项目(在同一解决方案中)。

  • EXE 项目具有通常的 DebugRelease(和 Profile)配置,但由于它们的源代码库相同用于构建三个不同的应用程序(比如 A1A2A3)。此外,它针对 x32 和 x64,因此总共有 3 x 3 x 2 = 18 个项目配置。

  • DLL 项目由所有三个目标应用程序共享,因此只有 3 个(DebugReleaseProfile)乘以 2 (x32, x64) = 6 种配置。

  • 由于 EXE 项目依赖于 DLL,因此每当修改 DLL 项目的相关输出时,都需要将其复制到其目标文件夹(或其子文件夹)。

您将如何处理 DLL 的更新?

  • 每个 DLL 项目中的构建后操作不起作用(很好),因为它必须将 DLL 复制到 A1A2 的相关输出文件夹A3。输出文件夹中的任何更改都会导致必须修改 50 个 DLL 项目中的每个项目中的构建后操作。

  • 我目前将 DLL 本身作为项目项添加到 EXE 项目中,并配置了自定义构建工具以将其复制到输出文件夹。但这需要我将每个 DLL 添加 6 次,所以我最终得到 6 x 50 = 300 个 DLL!

我真正需要的是像“复制本地”选项这样的东西,不幸的是它只适用于程序集。您是否建议简化此构建设置的解决方案?

【问题讨论】:

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


    【解决方案1】:

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

    这只能通过两个动作来完成:

    • 将所有DLL的输出目录设置为$(ConfigurationName)_$(PlatformShortName)之类的文件夹

      • 选择所有 DLL 项目
      • 右键单击 -> 属性
      • 选择所有配置和所有平台
      • 设置输出目录
    • 向 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

    【讨论】:

      猜你喜欢
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多