我有一个不包含源代码的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>
答案 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项目中)。