ClCompile项目也是一项任务吗?

时间:2018-03-31 19:54:43

标签: c++ visual-studio visual-c++ msbuild

我试图在这里理解visual cpp项目文档(https://docs.microsoft.com/en-us/cpp/build/walkthrough-using-msbuild-to-create-a-visual-cpp-project)。

<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
  <ItemGroup>  
    <ProjectConfiguration Include="Debug|Win32">  
      <Configuration>Debug</Configuration>  
      <Platform>Win32</Platform>  
    </ProjectConfiguration>  
    <ProjectConfiguration Include="Release|Win32">  
      <Configuration>Release</Configuration>  
      <Platform>Win32</Platform>  
    </ProjectConfiguration>  
  </ItemGroup>  
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.default.props" />  
  <PropertyGroup>  
    <ConfigurationType>Application</ConfigurationType>  
    <PlatformToolset>v120</PlatformToolset>  
  </PropertyGroup>  
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />  
  <ItemGroup>  
    <ClCompile Include="main.cpp" />  
  </ItemGroup>  
  <ItemGroup>  
    <ClInclude Include="main.h" />  
  </ItemGroup>  
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Targets" />  
</Project>  

我认为ClCompile是一个项目,因为它嵌套在ItemGroup标签下,似乎在ClCompile标签中引用了要编译的文件。在项目的文档页面https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-items上,它指出Items是构建系统的输入。我没有看到上面的任务采取这些ClCompile项目并编译它们,如何实现编译? ClCompile项目也是任务吗?

2 个答案:

答案 0 :(得分:1)

  

我没有看到上面的任务接受这些ClCompile项目并编译它们,如何实现编译? ClCompile项目也是任务吗?

在以下路径中搜索.targets文件夹中的所有.propsVCTargets个文件后:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets

我们可以在Microsoft.CppCommon.targets文件中找到以下代码段:

 <Target Name="ClCompile"
          Condition="'@(ClCompile)' != ''"
          DependsOnTargets="SelectClCompile">

    <PropertyGroup>
      <CLToolArchitecture Condition="'$(CLToolArchitecture)' == ''">$(VCToolArchitecture)</CLToolArchitecture>
      <CLDeleteOutputOnExecute Condition="'$(CLDeleteOutputOnExecute)' == ''">true</CLDeleteOutputOnExecute>
    </PropertyGroup>

    <ItemGroup>
      <ClNoDependencies Condition="'@(ClNoDependencies)' == '' and '%(ClInclude.NoDependency)' == 'true'" Include="@(ClInclude)"/>
      <ClNoDependencies Condition="'$(NoDependencies)' != ''" Include="$(NoDependencies)" />
    </ItemGroup>

    ...

    <OnError Condition="'$(OnXamlPreCompileErrorTarget)' != ''" ExecuteTargets="$(OnXamlPreCompileErrorTarget)" />
  </Target>

因此ClCompile应该是一个目标,用于执行Visual C ++编译器工具cl.exe来编译C / C ++源文件。这就是它不在MSBuild项中的原因。

有关详细信息,请参阅MSBuild (Visual C++) Overview

答案 1 :(得分:0)

是的,CLCompile实际上运行了CLTask任务类。我怀疑(虽然不确定)他们这样做,所以他们可以同时拥有CLCompile和CLInclude,而无需为每个人编写任务实现。我不确定在什么名称空间或程序集中,与纯.net语言的任务不同,c ++任务不在.net库文档中。