如何覆盖Visual Studio 2017社区的编译命令[重复]

2024-01-10

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

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

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


对于标准 C++ 项目文件编译是通过调用 MsBuild 完成的Target https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-targets named ClCompile。请注意,还有一个 MsBuildItem https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-items名为 ClCompile,其中列出了实际使用的 C++ 源文件,通过在文本编辑器中打开 .vcxproj 可以很容易地看到这一点。因此,此 ClCompile 项在 ClCompile 目标中使用,并在其中传递给CL https://learn.microsoft.com/en-us/visualstudio/msbuild/cl-task Task https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-tasks这反过来又会调用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 来使用任何可执行文件特性 https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-properties。实际上:打开 .vcxproj 文件并添加

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

一直到最后,在 import 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 目录中以进行全局覆盖。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何覆盖Visual Studio 2017社区的编译命令[重复] 的相关文章

  • 从服务器下载图像(cUrl,但接受建议)C++

    我试图通过从服务器 网站 下载图像来设置旋转背景图像 并尝试使用curl 来执行此操作 但是在执行此操作方面取得了0 成功 我的代码的 缩短的 版本如下 我没有收到错误 但是 如何 临时 保存该图像以将其显示为背景 是否有图像 类型变量 或
  • StackExchange Redis 删除所有以以下开头的键

    我有一个格式的密钥 Error 1 Error 24 Error 32 Using StackExchange Redis 我该怎么办KeyDelete在与格式匹配的所有键上Error 在另一个答案中我看到了 LUA 脚本 EVAL ret
  • 如何在 Google Mock 中使用可选参数来模拟方法?

    如何使用可选参数模拟方法谷歌模拟 例如 class A public void set enable bool enabled true class MockA public A MOCK METHOD1 set enable void b
  • 以编程方式更新 Wifi 网络

    我正在尝试创建一个程序 当某个 wifi 网络在范围内时 该程序会连接到该网络 即使已经连接到另一个 wifi 也是如此 我在用着简单Wifi https github com DigiExam simplewifi 基本上效果很好 除了在
  • MVC BaseController 处理 CRUD 操作

    我想重构我的基本 CRUD 操作 因为它们非常重复 但我不确定最好的方法 我的所有控制器都继承 BaseController 如下所示 public class BaseController
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • C++:避免​​在重载中将字符串自动转换为布尔值

    我想创建一组方法 这些方法将根据其类型输出具有特殊格式的值 当我这样做时 到目前为止看起来还不错 static void printValue std ostringstream out int value out lt lt value
  • 如何查看每秒更新的图表中的最后 10 个数据点?

    我有这个代码 private void timer Tick object sender EventArgs e timer Stop for int i 0 i lt TOTAL SENSORS i DateTime d DateTime
  • .Net 支持柯里化泛型吗?

    假设我们有一个嵌套的泛型类 public class A
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel
  • 对象变空似乎是 Hangfire 中的反序列化问题

    Hangfire 似乎无法反序列化我的原始版本Scheduler对象及其所有状态 我正在调用其 Execute 方法BackgroundJob Enqueue 如下所示 Scheduler new FileInFileOut FileIn
  • 向客户端发送状态码 500 时页面未呈现

    我有一个页面 通用处理程序 我想在该页面上向客户端返回状态代码 500 以指示出现问题 我这样做 Response StatusCode 500 Response StatusDescription Internal Server Erro
  • 对列表中的一系列整数求和

    假设我有一个这样的列表 List
  • Qt - 添加超链接到对话框

    有没有办法在 Qt 对话框中添加可点击的超链接 IE 它应该看起来像一个超链接 蓝色文本 当您单击它时 它应该在浏览器中打开该超链接 像这样的东西 Use QLabel setOpenExternalLinks bool 并在标签上设置文本
  • 在 OSX 上检测 Objective C 或 C++ 中的文件夹访问(如 fs_usage 命令)

    我正在 OSX 上开发实时病毒扫描程序 OSX 的命令行命令fs usage可以通过以下方式确定文件夹访问权限 并且只能以 root 用户身份运行 fs usage w f pathname grep Users Documents Use
  • C 中的 2 个字符要短

    我有2个字符 Char 128和查尔2 如何将这些字符转为 Short640 in C 我试过了 unsigned short getShort unsigned char array int offset short returnVal
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu
  • 在for循环中声明和初始化变量

    可以简单写一下吗 for int i 0 代替 int i for i 0 在 C 或 C 中 并且会变量i只能在循环内部访问 它在 C 中有效 它在 C 的原始版本中是不合法的 但在 C99 中被采用为 C 的一部分 当时一些 C 功能被
  • C# 使用 .Equals() 比较两个 double

    我使用 ReShaper 当我用 比较两个双精度值时 它建议我应该使用 Math 具有公差的 ABS 方法 看 https www jetbrains com help resharper 2016 2 CompareOfFloatsByE
  • 获取线段上最接近另一个点的点[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想找到线段AB上最接近另一个点P的点 我的想法是 Get a1 and b1由直线公式y1 a1x b1 使用 A 点

随机推荐

  • 如何比较没有缓存的 Neo4j 查询的性能?

    我一直在尝试比较 Neo4j 中的查询性能 为了使查询更高效 我添加了索引 使用profile分析结果 并尝试在使用USING INDEX时做同样的事情 在大多数查询中 使用第二个选项 使用 USING INDEX 时数据库命中要好得多 行
  • 在 C# 中使用嵌套数组反序列化 JSON

    我在尝试反序列化此 JSON 时遇到问题 response numfound 1 start 0 docs enID 9999 startDate 2013 09 25 bName XXX pName YYY UName ZZZ agent
  • 指定 --django-settings-module 标志时 pylint (pylint_django) 不起作用

    我正在使用最新版本pylint django前几天发布 Package Version pylint 2 7 4 pylint django 2 4 3 pylint plugin utils 0 6 当我启用时pylint在 VSC 中p
  • 什么是 ' 以及为什么 Google 搜索将其替换为撇号?

    用什么语言表示和 哈希 三 九 分号 39 代表撇号 我以 JSON 格式提取了一些网站数据 其中一些用户评论带有撇号 被替换为 39 那么 它是什么代表呢 我什至无法用谷歌搜索它 因为谷歌搜索撇号而不是和 哈希 三 九 分号 It s H
  • 将 VB6 AES Rijndael 分组密码转换为 C# 作者:Phil Fresle

    我正在将经典 asp 应用程序转换为 C 并且希望能够解密 c 中最初在经典 asp 中加密的字符串 经典的asp代码是here http www frez co uk vb6 aspx c 代码是here http www frez co
  • IMvcBuilder AddJsonOptions 在.Net Core 3.0 中去了哪里?

    我刚刚将我的 ASP Web API 项目从 NET Core 2 0 升级到 3 0 我正在使用 services AddMvc AddJsonOptions opts gt opts SerializerSettings Contrac
  • QFlags枚举类型转换突然失败

    我已经在库中运行了这段代码很长一段时间 MyClass MyClass QDialog setWindowFlags Qt CustomizeWindowHint Qt WindowTitleHint 然后 在更改库的各个部分后 我突然收到
  • 一个 Java 主题程序,可以读取一个巨大的 CSV 文件的行

    我有一个巨大的 CSV 文件 包含超过 700K 行 我必须解析该 CSV 文件的行并执行操作 我想到通过使用线程来做到这一点 我首先尝试做的事情很简单 每个线程都应该处理 CSV 文件的唯一行 我只能读取 3000 行 我创建了三个线程
  • 如何使用 ExtJS 更改光标

    我想设置网格的一列 以将光标悬停后更改为指针 我不知道应用样式是否是最佳实践 请告诉我 我就是想不通 这是我的代码 我希望该列能够在鼠标悬停时改变光标 Ext define Ext grid Panel store services xty
  • Java 并集、交集和差集的集合方法[重复]

    这个问题在这里已经有答案了 我编写了一个包含两个不同数字集合的程序 我想知道如何从这两个集合中获得并集 交集和集合差 我知道 BitSet 有方法 但这些方法在这里不起作用 public class Collections public s
  • Anaconda pip 离线安装包括依赖项(tensorflow)

    我想在没有互联网连接的系统上的 anaconda 环境中安装 tensorflow 并且我没有 root 访问权限 即我只想将其安装到本地用户 我已经下载了tensorflow的 whl文件和所需的依赖项 并将它们复制到我要使用的机器上 进
  • 从 infix 更改为 postfix 有什么好处?

    我今天看书了 它引入了从中缀变为后缀的算法 有什么好处 提前致谢 其一 与计算中缀表达式不同 您可以借助堆栈从左到右一次扫描轻松计算后缀表达式 其次 后缀表达式中不需要括号和优先规则等概念
  • 是否可以在 pandas 中使用自定义过滤器功能?

    我可以使用我的辅助函数来确定投篮是否为三指针作为 Pandas 中的过滤函数吗 我的实际功能要复杂得多 但我针对这个问题简化了它 def isThree x y return x y 3 print data isThree data x
  • 如何在iphone中获取gmsmapview的坐标中心

    我正在使用新的 iOS 版 Google 地图 SDK 我可以从 GMSMapView center 获取真实坐标吗 现在它返回一个 CGPoint 的值 但它不是真正的坐标 感谢和问候 Use the projection method
  • 从 Kotlin 隐藏静态 Java 方法

    我们正在将许多 java 静态方法转换为 kotlin 扩展函数 然而 我们需要保留一些 JUST FOR JAVA 的方法 我们希望强制 kotlin 代码使用扩展函数 有没有办法从 kotlin 中隐藏 java 静态方法 您可以使用注
  • Google Apps脚本:复制电子表格非常慢

    我有一个 Web 应用程序 其中脚本连接到电子表格 在脚本中 我从电子表格中查找文件的 ssid 打开该文件 然后复制并重命名它 相关行如下所示 var copy SpreadsheetApp openById ssid copy newN
  • sonarqube 忽略 sonar.junit.reportPaths

    我有一个 gradle 项目 它应用了 sonarqube gradle 插件 版本 2 6 我在我团队的 sonarqube 服务器版本 6 4 版本 25310 上运行它 根据文档 https docs sonarqube org di
  • å 在 xml 文件中是否有效?

    IE 不喜欢在 XML 文件中显示 字符 这是一个 IE 问题还是 和类似的字符确实是无效的 XML 我是否必须创建 xx 所有这些字母的值 Michel 顺便说一句 字符位于 CDATA 标记内 声明是这样的 嗯 似乎无法将 xml 声明
  • 角度 4 中的 html2canvas

    我可以在 Angular 4 中使用 html2canvas 截取屏幕截图 但我需要使用 http post 调用将字符串图像发送到服务器端 成分 import Component OnInit NgZone from angular co
  • 如何覆盖Visual Studio 2017社区的编译命令[重复]

    这个问题在这里已经有答案了 我想用一个简单的 shell 脚本覆盖默认的 Visual Studio C 编译器 我想要的是捕获参数 例如文件名 并创建一些统计信息 但是我想完全覆盖编译过程 也就是说 我想从我的 shell 脚本调用原始编