0

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

  • 编译 ProjectA(我只需要 .objs)
  • 编译链接ProjectB
  • 链接项目A

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

我曾经以这种方式使用 VS 2008 执行此操作:

  • ProjectB 上的 PreBuild 事件:vcbuild /pass0 /pass1ProjectA
  • 编译并链接 ProjectB(它是 ProjectA 的依赖项)
  • 编译(实际上什么都不做,因为它已经构建好了)并链接 ProjectA

但是 vcbuild 从 VS 2012 中消失了,我将命令替换为:

msbuild /t:BuildGenerateSources /t:BuildCompile

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

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

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

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

Edit2:听起来有人已经在这里问过类似的问题(没有解决方案)Visual Studio C++ 是否可以在不链接的情况下编译对象

4

1 回答 1

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 以及何时不执行。

于 2013-03-18T17:33:39.513 回答