0

我有一个不包含源代码的 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>
4

1 回答 1

3

好吧,这是由于 msbuild 项目中的评估顺序而发生的。 http://msdn.microsoft.com/en-us/library/dd997067.aspx

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

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

头文件对 ClCompile 目标没有意义。您可以将它们包含到 ClInclue 但不必(从 msbuild 的角度来看,您不必将它们包含到 msbuild 项目中)。

于 2014-09-16T21:17:45.813 回答