如何为 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
项目文件。我将 DefaultTargets
从 Build
更改为 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是很好的参考:
注意:
第一个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 提供的各种宏(类似于环境变量),因此可以对命令进行参数化,例如根据解决方案或项目名称或类型(调试与发布)创建目标目录。
VC++ 2013 可以使用 external build system
吗?
我希望 Visual Studio 除了通过调用我的构建工具进行构建之外什么也不做。
我正在考虑这样的事情:
- 将所有构建命令批量放入。
- 通过右键单击项目并选择构建来调用项目级构建批处理。
通过右键单击解决方案并选择构建来调用解决方案级别的构建批处理。
是否有一些演练教程?我搜索了很多但没有运气。
ADD 1 - 一些进展...
在简要阅读了 MSBuild
过程后,我尝试了以下方法。
首先,我编辑 *.vcxproj
项目文件。我将 DefaultTargets
从 Build
更改为 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是很好的参考:
注意:
第一个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 提供的各种宏(类似于环境变量),因此可以对命令进行参数化,例如根据解决方案或项目名称或类型(调试与发布)创建目标目录。