c++ - 使用 MSBuild 目标文件时查看 VS C++ 项目中的有效属性?

标签 c++ visual-studio msbuild

我正在导入 MSBuild 目标文件以将属性设置为 VS C++ 项目 - 即 include 和 libs 文件夹。 (我将 Nuget 用于 native 包,这就是它在那里完成的方式)。 我找不到在 IDE 中查看项目从属性文件中获取的有效属性值的方法。 当我查看项目属性(例如包含文件夹)时,它们是空的。 但目标文件正在运行,因为我能够使用在那里成功指定的包含、lib 文件夹。

如何从 IDE 查看值?

以下是其他详细信息: 我安装了 Microsoft.Azure.C.SharedUtility (1.0.19) 空 C++ 项目中的 Nuget 包。这导致将以下部分添加到 vcxproj 文件中:

    <ImportGroup Label="ExtensionTargets">
    <Import Project="..\packages\Microsoft.Azure.C.SharedUtility.1.0.19\build\native\Microsoft.Azure.C.SharedUtility.targets" Condition="Exists('..\packages\Microsoft.Azure.C.SharedUtility.1.0.19\build\native\Microsoft.Azure.C.SharedUtility.targets')" />
</ImportGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\Microsoft.Azure.C.SharedUtility.1.0.19\build\native\Microsoft.Azure.C.SharedUtility.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Azure.C.SharedUtility.1.0.19\build\native\Microsoft.Azure.C.SharedUtility.targets'))" />
</Target> 

目标文件本身是:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" InitialTargets="Microsoft_Azure_C_SharedUtil_Init">
  <PropertyGroup Label="Default initializers for properties">
    <Linkage-Microsoft_Azure_C_SharedUtil_Init Condition="'$(Linkage-Microsoft_Azure_C_SharedUtil_Init)' == ''">static</Linkage-Microsoft_Azure_C_SharedUtil_Init>
    <CallingConvention-Microsoft_Azure_C_SharedUtil Condition="'$(CallingConvention-Microsoft_Azure_C_SharedUtil)' == ''">cdecl</CallingConvention-Microsoft_Azure_C_SharedUtil>
  </PropertyGroup>
   <ItemDefinitionGroup>
    <ClCompile>
      <AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)../../build/native/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
    <ResourceCompile>
      <AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)../../build/native/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ResourceCompile>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Label="Win32Debug" Condition="(( $(Configuration.ToLower().IndexOf('debug')) &gt; -1 ) And ('$(Platform)' == 'Win32' ) )">
    <Link>
      <AdditionalDependencies>Secur32.lib;Ws2_32.lib;$(MSBuildThisFileDirectory)../../build/native/Win32/Debug/aziotsharedutil.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Label="Win32Release" Condition="(( $(Configuration.ToLower().IndexOf('debug')) == -1 ) And ('$(Platform)' == 'Win32' ) )">
    <Link>
      <AdditionalDependencies>Secur32.lib;Ws2_32.lib;$(MSBuildThisFileDirectory)../../build/native/Win32/Release/aziotsharedutil.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Label="Win64Debug" Condition="(( $(Configuration.ToLower().IndexOf('debug')) &gt; -1 ) And ('$(Platform)' == 'x64' ) )">
    <Link>
      <AdditionalDependencies>Secur32.lib;Ws2_32.lib;$(MSBuildThisFileDirectory)../../build/native/x64/Debug/aziotsharedutil.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Label="Win64Release" Condition="(( $(Configuration.ToLower().IndexOf('debug')) == -1 ) And ('$(Platform)' == 'x64' ) )">
    <Link>
      <AdditionalDependencies>Secur32.lib;Ws2_32.lib;$(MSBuildThisFileDirectory)../../build/native/x64/Release/aziotsharedutil.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Label="ARMDebug" Condition="(( $(Configuration.ToLower().IndexOf('debug')) &gt; -1 ) And ('$(Platform)' == 'ARM' ) )">
    <Link>
      <AdditionalDependencies>Secur32.lib;Ws2_32.lib;$(MSBuildThisFileDirectory)../../build/native/arm/Debug/aziotsharedutil.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Label="ARMRelease" Condition="(( $(Configuration.ToLower().IndexOf('debug')) == -1 ) And ('$(Platform)' == 'ARM' ) )">
    <Link>
      <AdditionalDependencies>Secur32.lib;Ws2_32.lib;$(MSBuildThisFileDirectory)../../build/native/arm/Release/aziotsharedutil.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Label="ARM64Debug" Condition="(( $(Configuration.ToLower().IndexOf('debug')) &gt; -1 ) And ('$(Platform)' == 'ARM64' ) )">
    <Link>
      <AdditionalDependencies>Secur32.lib;Ws2_32.lib;$(MSBuildThisFileDirectory)../../build/native/arm64/Debug/aziotsharedutil.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Label="ARM64Release" Condition="(( $(Configuration.ToLower().IndexOf('debug')) == -1 ) And ('$(Platform)' == 'ARM64' ) )">
    <Link>
      <AdditionalDependencies>Secur32.lib;Ws2_32.lib;$(MSBuildThisFileDirectory)../../build/native/arm64/Release/aziotsharedutil.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  <UsingTask TaskName="Microsoft_Azure_Shared_Util_Contains" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" TaskFactory="CodeTaskFactory">
    <ParameterGroup>
      <Text Output="false" ParameterType="System.String" />
      <Library Output="false" Required="true" ParameterType="System.String" />
      <Value Output="false" Required="true" ParameterType="System.String" />
      <Result Output="true" ParameterType="System.String" />
    </ParameterGroup>
    <Task>
      <Code>Result = ((Text ?? "").Split(';').Contains(Library) ) ? Value : String.Empty;</Code>
    </Task>
  </UsingTask>
  <Target Name="Microsoft_Azure_C_SharedUtil_Init">
    <Microsoft_Azure_Shared_Util_Contains Text="Linkage-dynamic" Library="Microsoft_Azure_Shared_Util" Value="dynamic" Condition="'$(Linkage-Microsoft_Azure_C_SharedUtil_Init)'==''">
      <Output TaskParameter="Result" PropertyName="Linkage-Microsoft_Azure_C_SharedUtil_Init" />
    </Microsoft_Azure_Shared_Util_Contains>
    <Microsoft_Azure_Shared_Util_Contains Text="Linkage-static" Library="Microsoft_Azure_Shared_Util" Value="static" Condition="'$(Linkage-Microsoft_Azure_C_SharedUtil_Init)'==''">
      <Output TaskParameter="Result" PropertyName="Linkage-Microsoft_Azure_C_SharedUtil_Init" />
    </Microsoft_Azure_Shared_Util_Contains>
    <Microsoft_Azure_Shared_Util_Contains Text="Linkage-ltcg" Library="Microsoft_Azure_Shared_Util" Value="ltcg" Condition="'$(Linkage-Microsoft_Azure_C_SharedUtil_Init)'==''">
      <Output TaskParameter="Result" PropertyName="Linkage-Microsoft_Azure_C_SharedUtil_Init" />
    </Microsoft_Azure_Shared_Util_Contains>
    <Microsoft_Azure_Shared_Util_Contains Text="Linkage-sxs" Library="Microsoft_Azure_Shared_Util" Value="sxs" Condition="'$(Linkage-Microsoft_Azure_C_SharedUtil_Init)'==''">
      <Output TaskParameter="Result" PropertyName="Linkage-Microsoft_Azure_C_SharedUtil_Init" />
    </Microsoft_Azure_Shared_Util_Contains>
    <Microsoft_Azure_Shared_Util_Contains Text="CallingConvention-cdecl" Library="Microsoft_Azure_Shared_Util" Value="cdecl" Condition="'$(CallingConvention-Microsoft_Azure_Shared_Util)'==''">
      <Output TaskParameter="Result" PropertyName="CallingConvention-Microsoft_Azure_Shared_Util" />
    </Microsoft_Azure_Shared_Util_Contains>
    <Microsoft_Azure_Shared_Util_Contains Text="CallingConvention-stdcall" Library="Microsoft_Azure_Shared_Util" Value="stdcall" Condition="'$(CallingConvention-Microsoft_Azure_Shared_Util)'==''">
      <Output TaskParameter="Result" PropertyName="CallingConvention-Microsoft_Azure_Shared_Util" />
    </Microsoft_Azure_Shared_Util_Contains>
    <Microsoft_Azure_Shared_Util_Contains Text="CallingConvention-fastcall" Library="Microsoft_Azure_Shared_Util" Value="fastcall" Condition="'$(CallingConvention-Microsoft_Azure_Shared_Util)'==''">
      <Output TaskParameter="Result" PropertyName="CallingConvention-Microsoft_Azure_Shared_Util" />
    </Microsoft_Azure_Shared_Util_Contains>
    <Microsoft_Azure_Shared_Util_Contains Text="CallingConvention-thiscall" Library="Microsoft_Azure_Shared_Util" Value="thiscall" Condition="'$(CallingConvention-Microsoft_Azure_Shared_Util)'==''">
      <Output TaskParameter="Result" PropertyName="CallingConvention-Microsoft_Azure_Shared_Util" />
    </Microsoft_Azure_Shared_Util_Contains>
    <Microsoft_Azure_Shared_Util_Contains Text="CallingConvention-clrcall" Library="Microsoft_Azure_Shared_Util" Value="clrcall" Condition="'$(CallingConvention-Microsoft_Azure_Shared_Util)'==''">
      <Output TaskParameter="Result" PropertyName="CallingConvention-Microsoft_Azure_Shared_Util" />
    </Microsoft_Azure_Shared_Util_Contains>
  </Target>
  <Target Name="Microsoft_Azure_Shared_Util_redist_AfterBuild" AfterTargets="AfterBuild" />
  <Target Name="Microsoft_Azure_Shared_Util_redist_AfterBuild_Win32_and_Debug" Label="Win32 and Debug" Condition="'$(Platform.ToLower())' == 'win32' And ( $(Configuration.ToLower().IndexOf('debug')) &gt; -1 )" AfterTargets="Microsoft_Azure_Shared_Util_redist_AfterBuild">
  </Target>
  <Target Name="Microsoft_Azure_Shared_Util_redist_AfterBuild_Win32_and_Release" Label="Win32 and Release" Condition="'$(Platform.ToLower())' == 'win32' And ( $(Configuration.ToLower().IndexOf('debug')) == -1 )" AfterTargets="Microsoft_Azure_Shared_Util_redist_AfterBuild">
  </Target>
  <Target Name="Microsoft_Azure_Shared_Util_redist_AfterBuild_Win64_and_Debug" Label="Win64 and Debug" Condition="'$(Platform.ToLower())' == 'x64' And ( $(Configuration.ToLower().IndexOf('debug')) &gt; -1 )" AfterTargets="Microsoft_Azure_Shared_Util_redist_AfterBuild">
  </Target>
  <Target Name="Microsoft_Azure_Shared_Util_redist_AfterBuild_Win64_and_Release" Label="Win64 and Release" Condition="'$(Platform.ToLower())' == 'x64' And ( $(Configuration.ToLower().IndexOf('debug')) == -1 )" AfterTargets="Microsoft_Azure_Shared_Util_redist_AfterBuild">
  </Target>
  <Target Name="Microsoft_Azure_Shared_Util_redist_AfterBuild_ARM_and_Debug" Label="ARM and Debug" Condition="'$(Platform.ToLower())' == 'ARM' And ( $(Configuration.ToLower().IndexOf('debug')) &gt; -1 )" AfterTargets="Microsoft_Azure_Shared_Util_redist_AfterBuild">
  </Target>
  <Target Name="Microsoft_Azure_Shared_Util_redist_AfterBuild_ARM_and_Release" Label="ARM and Release" Condition="'$(Platform.ToLower())' == 'ARM' And ( $(Configuration.ToLower().IndexOf('debug')) == -1 )" AfterTargets="Microsoft_Azure_Shared_Util_redist_AfterBuild">
  </Target>  
  <Target Name="Microsoft_Azure_Shared_Util_redist_AfterBuild_ARM64_and_Debug" Label="ARM64 and Debug" Condition="'$(Platform.ToLower())' == 'ARM64' And ( $(Configuration.ToLower().IndexOf('debug')) &gt; -1 )" AfterTargets="Microsoft_Azure_Shared_Util_redist_AfterBuild">
  </Target>
  <Target Name="Microsoft_Azure_Shared_Util_redist_AfterBuild_ARM64_and_Release" Label="ARM64 and Release" Condition="'$(Platform.ToLower())' == 'ARM64' And ( $(Configuration.ToLower().IndexOf('debug')) == -1 )" AfterTargets="Microsoft_Azure_Shared_Util_redist_AfterBuild">
  </Target>  
</Project>

该项目工作正常,包含正确的文件夹并引用正确的库,但我在 IDE 中看不到有效值。

谢谢, 罗伊。

最佳答案

如评论中所述,这看起来像是 VS 中的错误(或可能是功能):由于某种原因,当导入的文件在项目自己的 ItemDefinitionGroups 之后导入时,它具有编译器/链接器设置,但它的内容不是根据标准的 msbuild 评估规则,即使在构建中使用它,也会反射(reflect)在 IDE 中。

解决方法很简单:在项目文件中将 Import 移到更高的位置。事实上,正如您所看到的,Import 现在位于一个标记为“ExtensionTargets”的 ImportGroup 中,但在文件的更高层还有一个标记为“ExtensionSettings”的组,它似乎是为这样的用法量身定制的——VS 将正确显示结果设置,并且它们可以在需要时通过 standard project property system 被用户设置覆盖.

可以说(虽然我找不到支持它的文档)在这里做的最明智的事情是提供 2 个导入:实际的 targets 文件,顾名思义包含 msbuild 目标,在“ExtensionTargets”下导入,并在“ExtensionSettings”下导入带有编译器/链接器设置的单独文件。后者没有 .targets 扩展名,而是 .props 扩展名,因为这是最常用的约定。

关于c++ - 使用 MSBuild 目标文件时查看 VS C++ 项目中的有效属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40368614/

相关文章:

c++ - 如何将成员函数模板作为模板参数传递?

c++ - 串行数据包丢失 - QTSerialPort

c++ - 如何在不使用 variable_name.at() 的情况下引用字符串的最后一个字符?

c# - 使用 MeshGeometry3D 进行碰撞检测

visual-studio - 为什么 Visual Studio 2017 找不到已安装的 .NET Core SDK?

c++ - 写入字符串流后,为什么提取到字符串中会导致该字符串变成伪造的?

visual-studio - 如何在 Visual Studio 中出现错误波形时显示类型信息 [fsharp]

visual-studio-2010 - 在VS2010中一键发布后将DLL文件复制到bin目录

.net - 代码契约重写失败 - libpaths 命令

visual-studio-2012 - MSBuild.exe 和 dotnet 4.5