【问题标题】:vcxproj does not build generated source code the first timevcxproj 第一次没有构建生成的源代码
【发布时间】:2014-09-16 19:41:03
【问题描述】:

我有一个不包含源代码的 VS 2010 vcxproj。 PreBuildEvent 调用一个批处理文件,该批处理文件使用第三方工具将源代码生成到我的 src\ 目录中。这很好用。问题是第一次生成源代码(或清理后),VisualStudio 并没有真正编译生成的源代码。在随后的构建中,它会编译。这对我的 CI 构建机器来说是一个问题,也让开发人员很烦恼。有什么方法可以让 VS 识别那些生成的文件?

这是我的 .vcxproj 中的一个 sn-p

<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>

【问题讨论】:

  • 预构建事件的 sn-p 在哪里?
  • 谷歌“msbuild 延迟评估”以获得不错的点击率。如果这不成功,那么使用两个项目。

标签: visual-studio-2010 msbuild vcxproj


【解决方案1】:

嗯,这是因为 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 项目中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多