Visual studio 2010 vcxproj不会在第一次生成生成的源代码

Visual studio 2010 vcxproj不会在第一次生成生成的源代码,visual-studio-2010,msbuild,vcxproj,Visual Studio 2010,Msbuild,Vcxproj,我有一个VS2010 vcxproj,它不包含任何源代码。PreBuildEvent调用批处理文件,该批处理文件使用第三方工具将源代码生成到我的src\目录中。那很好。问题在于,在第一次生成源代码时(或在清理后),VisualStudio实际上并没有编译生成的源代码。在后续构建中,它会编译。这是我的CI构建机器的一个问题,也是开发人员的一个烦恼。有没有办法让VS识别这些生成的文件 下面是我的.vcxproj中的一个片段 <ItemDefinitionGroup> <PreB

我有一个VS2010 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>

从IDL生成
genNAPIEMsgs.bat

好吧,之所以发生这种情况,是因为msbuild项目中的求值顺序。

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

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


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

好的,这种情况的发生是因为msbuild项目中的求值顺序。

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

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


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

好的,这种情况的发生是因为msbuild项目中的求值顺序。

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

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


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

好的,这种情况的发生是因为msbuild项目中的求值顺序。

合并到编译中的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项目中)。

预生成事件的代码段在哪里?要获得外观良好的点击率,请搜索“msbuild delay evaluation”。如果没有成功,那么使用两个项目。预构建事件的代码段在哪里?Google“msbuild delay evaluation”以获得外观良好的点击率。如果没有成功,那么使用两个项目。预构建事件的代码段在哪里?Google“msbuild delay evaluation”以获得外观良好的点击率。如果没有成功,那么使用两个项目。预构建事件的代码段在哪里?Google“msbuild delay evaluation”以获得外观良好的点击率。如果没有成功,那么使用两个项目。