如何为 Visual C++ 2013 项目使用外部构建系统?

How to use external build system for Visual C++ 2013 project?

VC++ 2013 可以使用 external build system 吗? 我希望 Visual Studio 除了通过调用我的构建工具进行构建之外什么也不做。

我正在考虑这样的事情:

ADD 1 - 一些进展...

在简要阅读了 MSBuild 过程后,我尝试了以下方法。

首先,我编辑 *.vcxproj 项目文件。我将 DefaultTargetsBuild 更改为 MyTarget

<Project DefaultTargets="MyTarget" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

然后我添加一个名为 MyTarget:

的新目标
  <Target Name="MyTarget">
    <Message Text="Hello, Bitch!" />
  </Target>

希望这样可以绕过VS2013自带的构建过程,只进行自己的批处理

在命令提示符下运行良好:

但是在 Visual Studio 中,当我右键单击项目并选择 build 命令时,它给了我很多 link 错误。

如何避免这些 link 错误?因为我的批处理可以处理所有构建过程,所以我不需要 Visual Studio 为我做 link。

添加 2

似乎会出现这些 link 错误,因为我将 *.c 文件包含在 ClCompile 标签中,如下所示。

<ItemGroup>
   <ClCompile Include="z:\MyProject1\source1.c" />
<ItemGroup>

因为我不想让VS2013调用编译器,我把它改成<ClInclude>标签,link错误消失了,但符号解析不起作用......看来我应该'更改标签。

添加 3

这是另一种不用 linking 编译的方法。

Is it possible for Visual Studio C++ to compile objects without linking

似乎没有符号解析问题。但是我仍然无法通过单击 build/rebuild/clean.

调用外部批处理

(Michael Burr的回复指出了一个更好的方向,即更好的VC++项目模板,你可以结合我的回答。)

我终于解决了这个问题!

诀窍就是所谓的target overriding。 Visual Studio 上下文菜单项 Build\Rebuild\Clean 分别对应于名为 Build\Rebuild\Clean 的 MSBuild 目标。我们只需要在 *.vcxproj 文件中覆盖它们。

例如:

请记住:

The last target seen by MSBuild is the one that is used — this is why we put the at the end of the existing *.vcxproj file.

然后在 override.proj 中,按以下方式执行您喜欢的操作:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Build">
    <Message Text="Build override!" />
    <Exec Command="kickass.bat" />
  </Target>
</Project>

下面2个link是很好的参考:

  1. Hack the build

  2. Hijacking the Visual Studio Build Process

注意:

  • 第一个link以CSharp项目为例,但也适用于VC++项目。

  • 第二个 link 不适用于 VC++ 项目,但原理相似。如果您没有包含 Microsoft.Cpp.targets,您将在加载项目时看到以下错误:

加 1

正如我所试,我们不需要另一个 overrride.proj 文件。我们可以将特定目标放在 *.vcxprj 文件的末尾。如下图:

添加 2

使用上面提到的 target overriding,我可以使用 project's Build/Rebuild/Clean 命令 运行 我自定义的 bat 文件。但是我注意到当我 运行 solution's Build/Rebuild/Clean 命令时,我认为它只是遵循某种 project dependency order 来分别构建每个项目,这并不完全等同于什么我想要一个 overall build 在我的场景中。

我目前的解决方法是创建一个 dummy project 并使用它来触发我的 overall 构建的批处理。

您可能想查看 Visual Studio 的 makefile 项目(在 Visual C++/General 项目模板类别中)。

您可以指定为每种构建类型(清理、构建、重建)执行哪些命令。该命令可以调用 make、运行 批处理文件或调用其他构建工具。它只是执行一个命令。命令可以包含 VS 提供的各种宏(类似于环境变量),因此可以对命令进行参数化,例如根据解决方案或项目名称或类型(调试与发布)创建目标目录。