gpt4 book ai didi

c++ - MSBuild:VS2010 中 native C++ 项目的 Custom.After.Microsoft.Common.targets

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:24 24 4
gpt4 key购买 nike

我读过“Custom.Before.Microsoft.Common.targets”和“Custom.After.Microsoft.Common.targets”的使用,以便在每个项目构建之前/之后执行自定义目标,我会喜欢在我们的 TeamCity 构建服务器上构建时使用此技术来更改版本信息。

问题是,虽然它适用于 C# 项目,但它似乎不适用于 native C++ 项目。

在深入研究 Microsoft.Cpp.targets 文件后,我发现对于 native C++ 项目,这似乎是通过设置 $(ForceImportBeforeCppTargets) 和 $(ForceImportAfterCppTargets) 来实现的。

不过,我似乎无法在网络上找到任何关于 native C++ 应用程序技术的信息,所以我想问一下我是否在寻找正确的方向。

感谢任何帮助。

最佳答案

对于 VC++ 项目,它有点不同。您定义要在项目开始或结束时导入的文件。要使用此方法,您需要为属性 ForceImportBeforeCppTargetsForceImportAfterCppTargets 定义值。例如,如果您希望在项目的开头包含一个文件,您可以在命令行中传入该值。例如,我刚刚创建了一个名为 CppTets​​01 的虚拟 VC++ 项目。然后我创建了下面的两个示例文件。

Before.proj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">


<Target Name="CustomTargetInBefore" AfterTargets="Build">
<Message Text="From CustomTargetInBefore" Importance="high"/>
</Target>

</Project>

After.proj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Target Name="CustomTargetInAfter" AfterTargets="Build">
<Message Text="From CustomTargetInAfter" Importance="high"/>
</Target>

</Project>

然后我执行了以下命令:

msbuild CppTest01.vcxproj 
/p:ForceImportBeforeCppTargets="C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\Before.proj";
ForceImportAfterCppTargets="C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\After.proj"

结果是C:\Temp_NET\ThrowAway\CppTest01\CppTest01>msbuild CppTest01.vcxproj/p:ForceImportBeforeCppTargets="C:\Temp_NET\ThrowAway\CppTest01\CppTest01\Before.proj";ForceImportAfterCppTargets="C:\Temp_NET\ThrowAway\CppTest01\CppTest01\After.proj"

Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 10/18/2010 8:32:55 AM.
Project "C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\CppTest01.vcxproj" on node 1 (default targets).
InitializeBuildStatus:
Creating "Debug\CppTest01.unsuccessfulbuild" because "AlwaysCreate" was specified.
ClCompile:
All outputs are up-to-date.
All outputs are up-to-date.
ManifestResourceCompile:
All outputs are up-to-date.
Link:
All outputs are up-to-date.
Manifest:
All outputs are up-to-date.
FinalizeBuildStatus:
Deleting file "Debug\CppTest01.unsuccessfulbuild".
Touching "Debug\CppTest01.lastbuildstate".
CustomTargetInBefore:
From CustomTargetInBefore
CustomTargetInAfter:
From CustomTargetInAfter
Done Building Project "C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\CppTest01.vcxproj" (default targets).


Build succeeded.
0 Warning(s)
0 Error(s)

Time Elapsed 00:00:00.21

正如您从输出中看到的那样,目标已成功注入(inject)到构建过程中。如果您想将此与 Custom.Before.Microsoft.Common.targetsCustom.Before.Microsoft.Common.targets 联系起来,那么您应该知道那里使用的技术有点不同。具体来说,如果您创建这些文件,它们会自动导入到每个 C#/VB.NET 项目中。在这种情况下,您必须设置此属性。你真的有两个选择:

  1. 您可以将此属性设置为环境变量
  2. 您可以使用另一种技术,ImportBefore 和 ImportAfter,这是 VC++ 特有的

对于#1,让我解释一下。在 MSBuild 中,当您使用语法 $(PropName) 访问属性时,如果名称为 PropName 的属性不存在,MSBuild 将在环境变量中查找是否存在这样的值,如果存在,则返回该值.因此,如果您有一个构建服务器,您希望在其中为每个 VC++ 构建包含一个文件,那么只需将这些属性创建为环境变量即可。现在介绍另一种技术。

导入前/导入后在 VC++ 中引入了一个新概念。在 Microsoft.Cpp.Win32.targets 中,您可以在 .targets 文件顶部看到声明。

<Import Project="$(VCTargetsPath)\Platforms\Win32\ImportBefore\*.targets" 
Condition="Exists('$(VCTargetsPath)\Platforms\Win32\ImportBefore')" />

然后有一个朝向底部

<Import Project="$(VCTargetsPath)\Platforms\Win32\ImportAfter\*.targets" 
Condition="Exists('$(VCTargetsPath)\Platforms\Win32\ImportAfter')" />

其他目标平台也存在类似的导入声明。查看 %ProgramFiles32%\MSBuild\Microsoft.Cpp\v4.0\Platforms\ 中的文件以了解具体名称。

使用此技术,如果您想要导入文件,则只需创建一个以 .targets 结尾的文件并将其放入适当的文件夹中。这样做的好处是它将被导入到该平台的每个 VC++ 构建中,并且您可以创建许多不同的文件。缺点是您必须将它们放在那些特定的文件夹中。这是两种技术之间的主要区别。使用第一种技术,您可以通过属性指定文件位置,并且它不会自动包含在每个构建中,但对于第二种方法,它是但您不能更改位置

关于c++ - MSBuild:VS2010 中 native C++ 项目的 Custom.After.Microsoft.Common.targets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3924404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com