c++ - 如何覆盖 Visual Studio 2017 Community 的编译命令

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

<分区>

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

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

我想在全局范围内改变这一点。我该怎么做?

最佳答案

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

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

但是 CL 可以简单地通过覆盖 CLToolExe 和 CLToolPath 使用任何可执行文件 properties .实际上:打开您的 .vcxproj 文件并添加

<PropertyGroup>
  <CLToolExe>mycl.exe</CLToolExe>
  <CLToolPath>c:\path\to\mycompilerstub\</CLToolPath>
</PropertyGroup>

一直到最后,在 importing Microsoft.Cpp.targets 行之后;将调用 mycl.exe 而不是 cl.exe。如果你想在你的机器上全局获得相同的效果,你可以将该 PropertyGroup 放在一个单独的 msbuild 文件中,并将其保存在例如 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Platforms\x64\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 目录中以进行全局覆盖。

关于c++ - 如何覆盖 Visual Studio 2017 Community 的编译命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45835043/

相关文章:

c++ - Visual Studio C++ 中的 opencv 没有输出

c++ - 使用 For 循环更改二维数组中一行的值

c++ - 在 API 中控制 WndProc 函数的问题

java - 如何在我的 Mac 上编译和运行 Java 程序?

c++ - 为什么 C++ 编译需要这么长时间?

visual-studio-2017 - 在调试 "a 64-bit debugging operation is taking longer than expected."时出现 Visual Studio 错误

c++ - 如何制作模板结构 vector

c++ - 将无符号整数输入属性传递给顶点着色器

java - Maven编译报错try-with-resources

visual-studio-2015 - 如何在代理后面为 Visual Studio 配置 npm、git 和 bower