Visual Studio 2012可以执行自定义构建,例如:编译项目A>编译并链接项目B>链接项目A?

时间:2013-03-13 22:55:37

标签: visual-c++ visual-studio-2012 msbuild build-process

我正在寻找一种使用Visual Studio 2012以此顺序构建项目的方法(C ++,但可能是一般性问题):

  • 编译ProjectA(我只需要.objs)
  • 编译并链接ProjectB
  • Link ProjectA

我不能简单地在ProjectB中使用ProjectA的引用/依赖项,因为它会过早地执行ProjectA的链接。

我曾经这样用VS 2008这样做:

  • ProjectB上的PreBuild事件:vcbuild /pass0 /pass1 ProjectA
  • 编译并链接ProjectB(这是ProjectA的依赖项)
  • 编译(实际上什么也没做,因为它已经建成)并链接ProjectA

但是vcbuild已经从VS 2012中消失了,我用以下命令替换了命令:

msbuild /t:BuildGenerateSources /t:BuildCompile

这里的问题是,在第3步,它应该只链接(因为msbuild已经编译),现在再次编译ProjectA ,然后链接它。使用msbuild启用诊断详细程度向我展示了这一点:由于自上次构建以来命令行发生了更改而强制重建所有源文件。。几乎没有人(包括Visual Studio 2010 randomly says the command line changed, and rebuilds)有解决方案,因为无法看到正在比较的2个命令。

使用Visual Studio直接执行我正在寻找的东西(没有在命令行中启动msbuild的预构建事件)的另一个好处是将编译错误报告给错误列表并在“输出”窗口中单击。

也许在幕后,这将使用vcxprojs中指定的msbuild和Targets,但我想知道它是否可行。

编辑:我已经尝试用devenv替换调用msbuild的命令,但没有devenv的开关,只能指定编译(没有链接),所以它也不能使用。

Edit2:听起来像某人已经问过类似的东西(没有解决方案)Is it possible for Visual Studio C++ to compile objects without linking

1 个答案:

答案 0 :(得分:1)

好的,可以通过覆盖.vcxproj中的 BuildSteps 并删除目标BuildLink来完成。

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
      <BuildSteps Condition="'$(BuildSteps)' == '' or '$(SkipLink)'!='false'">
            ResolveReferences;
            PrepareForBuild;
            InitializeBuildStatus;
            BuildGenerateSources;
            BuildCompile;
            <!-- BuildLink; -->
      </BuildSteps>
</PropertyGroup>

当VS构建时,它不会执行链接步骤。 原始BuildSteps在 C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ V110 \ Microsoft.BuildSteps.target

中定义

要最后在命令行上链接项目(例如,从另一个项目的构建事件),我们调用:

msbuild /t:BuildLink /p:VisualStudioVersion=11.0 /p:Configuration=Debug /p:Platform=x64 /p:SkipLink=false "ProjectA.vcxproj"

请注意,SkipLink条件已添加到BuildSteps覆盖中,因此我们可以指定何时执行BuildLink以及何时不执行。