我意识到之前已经问过这个问题 - 但没有一个答案适用于我的具体案例:
我有一个包含本机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!
我真正需要的是类似于复制本地选项,但不幸的是只能使用程序集。您是否建议简化此构建设置?
答案 0 :(得分:5)
我要做的是将所有DLL放在一个文件夹中(特定于Debug / Release等),然后将它们复制回EXE的相应输出文件夹。
这只能在两个动作中完成:
将所有DLL的输出目录设置为$(ConfigurationName)_$(PlatformShortName)
向EXE项目添加构建后操作,对于将$(ConfigurationName)_$(PlatformShortName)\*.dll
复制到$(TargetDir)
修改强>
第二步中存在问题,因为EXE的$(ConfigurationName)
与您的DLL项目不同。不确定,但也许你可以有一种方法来推断相应的配置,以便仍然为你的所有18个配置都有一个post-build事件。这可能是一个新的SO问题:)
答案 1 :(得分:0)
这适用于 VisualStudio 2019(可能以前的版本也有但没有尝试过)
我尝试了几种方法,这是最好的折衷方案:
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