6

是否可以使用external build systemfor VC++ 2013?我希望 Visual Studio 除了通过调用我的构建工具来构建之外什么都不做。

我正在考虑这样的事情:

  • 将所有构建命令分批放置。
  • 通过右键单击项目并选择构建来调用项目级构建批处理。
  • 通过右键单击解决方案并选择构建来调用解决方案级构建批处理。

    是否有一些演练教程?我搜索了很多,但没有运气。

ADD 1 - 一些进展...

在简要阅读了该MSBuild过程之后,我尝试如下。

首先,我编辑*.vcxproj项目文件。我将DefaultTargetsfrom更改BuildMyTarget.

<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命令时,它给了我很多链接错误。

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

添加 2

似乎这些链接错误出现了,因为我包含了带有如下标签的*.c文件。ClCompile

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

由于我不希望VS2013调用编译器,所以我将其更改为<ClInclude>标记,链接错误消失了,但符号解析不起作用......似乎我不应该更改标记。

添加 3

这是另一种无需链接的编译方式。

Visual Studio C++ 是否可以在不链接的情况下编译对象

似乎它没有符号解析问题。但我仍然无法通过 click 调用外部批处理build/rebuild/clean

4

2 回答 2

3

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

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

于 2015-10-28T02:16:21.863 回答
1

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

最后,我解决了这个问题!

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

比如这样:

在此处输入图像描述

请记住:

MSBuild 看到的最后一个目标是使用的目标 - 这就是我们将 放在现有 *.vcxproj 文件末尾的原因。

在 中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个链接是很好的参考:

  1. 破解构建

  2. 劫持 Visual Studio 构建过程

注意:

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

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

在此处输入图像描述

加 1

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

在此处输入图像描述

添加 2

target overriding如上所述,我可以使用 Build/Rebuild/Clean 命令运行我的自定义文件batproject's但我注意到,当我运行solution'sBuild/Rebuild/Clean 命令时,我认为它只是按照某种方式project dependency order分别构建每个项目,这并不完全等同于我overall build在我的场景中想要的。

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

于 2015-10-26T15:00:15.357 回答