是否可以在VC ++ 2013中使用external build system
?
我希望Visual Studio不做任何事情,只需通过调用我的构建工具来构建。
我正在考虑这样的事情:
通过右键单击解决方案并选择构建来调用解决方案级别的构建批处理。
是否有一些演练教程?我搜索了很多但没有运气。
在简要阅读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
命令时,它会给我带来很多链接错误。
如何避免这些链接错误?由于我的批处理可以处理所有构建过程,因此我不需要Visual Studio为我做链接。
似乎这些链接错误显示出来,因为我将*.c
个文件包含ClCompile
标记,如下所示。
<ItemGroup>
<ClCompile Include="z:\MyProject1\source1.c" />
<ItemGroup>
由于我不希望VS2013调用编译器,我将其更改为<ClInclude>
标签,链接错误消失,但符号解析无法正常工作......似乎我不应该这样做改变标签。
这是另一种无需链接编译的方式。
Is it possible for Visual Studio C++ to compile objects without linking
似乎它没有符号解析问题。但是我仍然无法通过点击build/rebuild/clean
来调用外部批次。
答案 0 :(得分:3)
您可能希望查看Visual Studio的makefile项目(在Visual C ++ / General项目模板类别中)。
您可以为每种类型的构建指定要执行的命令(清理,构建,重建)。该命令可以调用make,运行批处理文件或调用其他一些构建工具。它只是执行一个命令。这些命令可以包含VS提供的各种宏(类似于环境变量),因此可以根据解决方案或项目名称或类型(调试与发布)制作目标目录等参数化命令。
答案 1 :(得分:1)
(Michael Burr的回复指出了更好的方向,即更好的VC ++项目模板。你可以将我的答案和他的答案结合起来。)
最后,我解决了这个问题!
诀窍是所谓的target overriding
。 Visual Studio上下文菜单项Build\Rebuild\Clean
分别对应于名为Build\Rebuild\Clean
的MSBuild目标。我们只需要在*.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个链接是很好的参考:
请注意:
第一个链接以CSharp项目为例,但也适用于VC ++项目。
第二个链接对VC ++项目不起作用,但理性是相似的。如果您未包含Microsoft.Cpp.targets
,则在加载项目时会看到以下错误:
正如我尝试的那样,我们不需要另一个overrride.proj
文件。我们可以将特定目标放在*.vcxprj
文件的末尾。如下:
使用上面提到的target overriding
,我可以使用bat
Build / Rebuild / Clean命令运行我的自定义project's
文件。但是我注意到当我运行solution's
Build / Rebuild / Clean命令时,我认为它只是按照某种project dependency order
分别构建每个项目,这与我想要的不完全相同我的方案中overall build
。
我目前的解决方法是创建dummy project
并使用它来触发我的overall
版本的批处理。