我有一个包含四个项目的 Visual Studio 2017 解决方案:一个共享静态 LIB (C++)、一个使用静态 dll 链接构建的 DLL (C++)、一个使用动态链接构建的 EXE (C++) 以及一个引用 DLL 和执行文件。 DLL 和 EXE 项目都引用静态 LIB 项目,但它们使用不同的链接选项来引用它。 LIB 项目必须构建两次,一次使用静态链接 (
/MT
),一次使用动态链接 (/MD
),我通过不同的项目配置使其成为可能。如何组织我的解决方案以使构建设置变得简单直观?
我当前的解决方案是使用批量构建,以便构建两个 LIB 配置。 DLL项目直接引用LIB(两个项目都配置了静态CRT链接,
/MT
),EXE项目没有项目引用,但LIB.lib
(使用/MD
选项构建)手动添加到其他依赖项。但在我的所有其他项目中,我不使用批量构建,我担心将来我会忘记它并使用常规构建解决方案(Ctrl+Alt+B)构建解决方案,这将导致错误的构建。
当您通过 GUI 添加项目引用时,
ItemGroup
会添加到项目文件中。该项目需要更改,并且需要添加 Properties
项目:
<ItemGroup>
<ProjectReference Include="..\other_project_dir\other_project_name.vcxproj">
<Project>{SOME-GUID-HERE}</Project>
<Properties>Configuration=$(Configuration)</Properties>
</ProjectReference>
</ItemGroup>
在我的例子中,
Configuration=$(Configuration)
恰好是所需的项目值。然而,这只是添加了一个引用,但并不强制在所需的配置中构建 other_project_name
。我们需要单独构建它,目标为MSBuild
:
<Target Name="MyBeforeBuild" BeforeTargets="InitializeBuildStatus">
<MSBuild Projects="..\other_project_dir\other_project_name.vcxproj"
Properties="Configuration=$(Configuration)"
Targets="Build" />
</Target>