gpt4 book ai didi

msbuild - 如何合并 Directory.Build.props 文件中的属性而不是覆盖属性?

转载 作者:行者123 更新时间:2023-12-02 12:04:25 32 4
gpt4 key购买 nike

我有以下 Directory.Build.props 文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LibraryPath>$(BOOST_ROOT)\lib32-msvc-14.2</LibraryPath>
<IncludePath>$(BOOST_ROOT)\</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LibraryPath>$(BOOST_ROOT)\lib64-msvc-14.2</LibraryPath>
<IncludePath>$(BOOST_ROOT)\</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LibraryPath>$(BOOST_ROOT)\lib32-msvc-14.2</LibraryPath>
<IncludePath>$(BOOST_ROOT)\</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LibraryPath>$(BOOST_ROOT)\lib64-msvc-14.2</LibraryPath>
<IncludePath>$(BOOST_ROOT)\</IncludePath>
</PropertyGroup>
</Project>

每当我在子文件夹(在 Visual Studio 2019 中)中加载 (C++) 项目时,该项目都会丢失所有继承的包含路径和库路径:

继承的值(value)观: Inherited Values

我想这可能是因为我没有附加到 IncludePathLibraryPath,所以我这样做了并将 props 文件更改为遵循:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LibraryPath>$(LibraryPath);$(BOOST_ROOT)\lib32-msvc-14.2</LibraryPath>
<IncludePath>$(IncludePath);$(BOOST_ROOT)\</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LibraryPath>$(LibraryPath);$(BOOST_ROOT)\lib64-msvc-14.2</LibraryPath>
<IncludePath>$(IncludePath);$(BOOST_ROOT)\</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LibraryPath>$(LibraryPath);$(BOOST_ROOT)\lib32-msvc-14.2</LibraryPath>
<IncludePath>$(IncludePath);$(BOOST_ROOT)\</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LibraryPath>$(LibraryPath);$(BOOST_ROOT)\lib64-msvc-14.2</LibraryPath>
<IncludePath>$(IncludePath);$(BOOST_ROOT)\</IncludePath>
</PropertyGroup>
</Project>

然后重新加载项目,再次导致继承值丢失。

我仔细检查了宏是否存在,它们是(VC_WindowsSDK_ 宏):

macros are present

我还尝试将 Directory.Build.props 更改为 Directory.Build.targets 以使其在项目加载后加载,但随后文件无法获取完全加载。

如何确保我的 Directory.Build.props 继承默认值,并附加我的自定义选项?

我想要这样做的原因是因为我正在迁移已弃用的 Microsoft.Cpp.Win32.user.props 文件。

将扩展名更改为 .targets 仅适用于构建过程,但 intellisense/Visual Studio 不会识别包含文件,并显示很多错误(在编译之前)。这不是优选的。

最佳答案

钱佩里的回答需要改进。以下是我的担忧:

  1. INCLUDE/LIB 环境变量对于所有想要使用它的项目来说都是全局的方法。
    必须为每个项目设置 MSBuild 参数
  2. 已弃用 user.props 的使用,并且对所有项目都是全局的

Directory.Build.props 的问题在于它在定义 $(IncludePath) 和 $(LibraryPath) 之前被包含。您可以手动设置 VS 的默认路径,但这是不好的做法。

要利用 user.props 后继 Directory.Build.props 和 IntelliSense,我建议使用 AdditionalIncludeDirectoriesAdditionalLibraryDirectories
以下是 Directory.Build.props 配置的示例:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros">
<BoostPath>$(BOOST_ROOT)</BoostPath>
<BoostPlatform Condition="'$(Platform)'=='Win32'">lib32</BoostPlatform>
<BoostPlatform Condition="'$(Platform)'=='x64'">lib64</BoostPlatform>
<BoostDebug Condition="'$(Configuration)'=='Debug'">\debug</BoostDebug>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(BoostPath);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>$(BoostPath)\$(BoostPlatform)-msvc-$([System.Text.RegularExpressions.Regex]::replace($(PlatformToolset), "v(\d+)(\d)$", "$1.$2"))$BoostDebug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
</Project>

如果要在项目内设置其他路径,请确保分别添加 ;%(AdditionalIncludeDirectories);%(AdditionalLibraryDirectories) 以包含来自 Prop 文件。

BoostDebug 属性设置为编译调试库的位置。在此示例中,它将是lib32-msvc-14.2/debug/

正则表达式术语 $([System.Text.RegularExpressions.Regex]::replace($(PlatformToolset), "v(\d+)(\d)$", "$1.$2")) 将平台工具集(例如 v142​​)转换为 lib 路径附录 14.2

为了提高可读性,最好在 PropertyGroup 中对其进行初始化,但 $(PlatformToolset) 不会在 props 文件解析时尽早初始化。幸运的是,当设置 $(PlatformToolset) 时,会在链接期间评估 AdditionalLibraryDirectories

如果您想要更好的可读性或需要对 $(PlatformToolset) 进行更复杂的操作,我建议另外使用 Directory.Build.targets 配置。解析此文件时,$(PlatformToolset) 已被初始化。
示例Directory.Build.targets:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros">
<BoostToolset>$([System.Text.RegularExpressions.Regex]::replace($(PlatformToolset), "v(\d+)(\d)$", "$1.$2"))</BoostPlatform>
</PropertyGroup>
<ItemDefinitionGroup>
<Link>
<AdditionalLibraryDirectories>$(BoostPath)\$(BoostPlatform)-msvc-$(BoostToolset)$BoostDebug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
</Project>

关于msbuild - 如何合并 Directory.Build.props 文件中的属性而不是覆盖属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59625826/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com