如何覆盖Visual Studio 2017社区的编译命令

时间:2017-08-23 08:55:35

标签: c++ compilation visual-studio-2017 visual-studio-community

我想用简单的shell脚本覆盖默认的Visual Studio C ++编译器。我想要的是捕获参数,如文件名,并创建一些统计信息。但是我想完全覆盖编译过程 - 也就是说,我想从我的shell脚本中调用原始编译。

我用谷歌搜索,但我发现的是如何在项目中执行预构建和后构建脚本。那不是我想要的。

我想全局改变这一点。我该怎么办?

1 个答案:

答案 0 :(得分:3)

对于标准C ++项目文件,通过调用名为ClCompile的MsBuild Target来完成编译。请注意,还有一个名为ClCompile的MsBuild Item列出了所使用的实际C ++源文件,通过在文本编辑器中打开.vcxproj可以很容易地看到这一点。因此,此ClCompile项在ClCompile目标中使用,然后传递给CL Task,而properties {{3}}将调用实际的编译器可执行文件cl.exe。此代码可以在您使用的工具集的Microsoft.CppCommon.targets文件中找到,用于64位计算机上的VS2017社区的默认安装,即C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community \ Common7 \ IDE \ VC \ VCTargets \ Microsoft.CppCommon.targets。

这3个中的任何一个都可以用自定义版本覆盖,但是你认为已经只是替换磁盘上的cl.exe并不是最好的主意。

但CL只需覆盖CLToolExe和CLToolPath {{3}}即可使用任何可执行文件。实际上:打开.vcxproj文件并添加

<PropertyGroup>
  <CLToolExe>mycl.exe</CLToolExe>
  <CLToolPath>c:\path\to\mycompilerstub\</CLToolPath>
</PropertyGroup>
在导入Microsoft.Cpp.targets的行之后,

一直到最后;将调用mycl.exe而不是cl.exe。如果您希望在您的计算机上全局使用相同的效果,则将该PropertyGroup放在单独的msbuild文件中并将其保存在例如C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community \ Common7 \ IDE中\ VC \ VCTargets \平台\ 64 \ ImportAfter \ MyCustomImport.targets。该目录中的任何目标文件都将自动导入。

作为替代方案,您可以覆盖ClCompile目标或CL任务。但是,这涉及到更多,例如对于ClCompile,您首先要复制Microsoft.CppCommon.targets中的整个实现,然后添加您需要的任何逻辑。优点是您可以直接访问例如源文件等,而无需解析命令行。例如,这将覆盖ClCompile并打印源文件并将它们传递给自定义可执行文件:

<Target Name="ClCompile"
        Condition="'@(ClCompile)' != ''"
        DependsOnTargets="SelectClCompile">

  <Message Text="All the sources = @(ClCompile)"/>
  <Exec Command="mycustom.exe @(ClCompile)" />

  ... <!--rest of implementation copied from Microsoft.CppCommon.targets goes here-->
</Target>

同样,这需要放在项目文件的末尾或者导入全局覆盖的ImportAfter目录中。