【问题标题】:Can Visual Studio 2012 do a custom build such as: compile project A > compile and link project B > link project A?Visual Studio 2012 可以进行自定义构建,例如:编译项目 A > 编译和链接项目 B > 链接项目 A?
【发布时间】:2013-03-13 22:55:37
【问题描述】:

我正在寻找一种使用 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 randomly says the command line changed, and rebuilds)对此有解决方案,因为无法查看正在比较的两个命令。

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

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

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

Edit2:听起来好像有人在这里问过类似的问题(没有解决方案)Is it possible for Visual Studio C++ to compile objects without linking

【问题讨论】:

  • 我很好奇你为什么需要这样做
  • 因为我需要 ProjectA(它是一个 DLL)的 objs 来为 ProjectB(它是一个 DLL)创建一个 .def 文件来创建一个导入库。
  • 为什么不让 ProjectA 的构建后活动生成自己的 .def 文件作为输出,以便在需要时可用,而不是让依赖项目在其上生成输出代表?

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


【解决方案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 以及何时不执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多