vcxproj第一次不构建生成的源代码

时间:2014-09-16 19:41:03

标签: visual-studio-2010 msbuild vcxproj

我有一个不包含源代码的VS 2010 vcxproj。 PreBuildEvent调用批处理文件,该文件使用第三方工具在我的src \目录中生成源代码。这很好。问题是第一次生成源代码(或干净后),VisualStudio实际上并没有编译生成的源代码。在后续构建中,它会进行编译。这对我的CI构建机器来说是一个问题,也对开发人员来说很烦人。有没有办法让VS识别那些生成的文件?

这是我的.vcxproj

的片段
<ItemDefinitionGroup>
  <PreBuildEvent>
    <Message>Generating from IDL </Message>
    <Command>genNAPIEMsgs.bat</Command>
  </PreBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
  <ClInclude Include="src\*.h" />
</ItemGroup>
<ItemGroup>
  <ClCompile Include="src\*.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ItemGroup>
  <DDSGeneratedFiles Include="src\*.cpp" />
  <DDSGeneratedFiles Include="src\*.h" />
</ItemGroup>
<Target Name="AfterClean">
  <Message Text="AfterClean target: removing generated source code" />
  <Delete Files="@(DDSGeneratedFiles)" />
</Target>

1 个答案:

答案 0 :(得分:3)

嗯,这是因为msbuild项目中的评估顺序。 http://msdn.microsoft.com/en-us/library/dd997067.aspx

合并到编译中的Cpp文件被定义为全局项ClCompile。因此在执行任何目标之前对它们进行评估。在评估开始时,没有生成cpp文件,因此没有编译生成的文件。 您可以通过目标的“返回”属性修改ClCompile项目。但据我所知,PreBuildEvent目标不返回任何内容。 因此,您可以将自己的目标注入到将修改ClCompile项目的构建中。 好吧,我还没试过,但我会从这样的事情开始:

<Target Name="AppendMyGeneratedFilesToClCompile" DependsOnTargets="PreBuildEvent" Returns="@(ClCompile)" >
    <ItemGroup>
       <ClCompile Include="src\*.cpp" />
    </ItemGroup>
</Target>

标头文件对于ClCompile目标毫无意义。您可以将它们包含在ClInclue中但不必包含(从msbuild透视图中,您不必将它们包含在msbuild项目中)。