MSVC 编译器 (cl.exe) 启动新的控制台窗口。如何预防?

Posted

技术标签:

【中文标题】MSVC 编译器 (cl.exe) 启动新的控制台窗口。如何预防?【英文标题】:MSVC compiler (cl.exe) starts new console window. how to prevent? 【发布时间】:2020-04-27 11:47:59 【问题描述】:

我的一个 Win10 桌面在 Visual c++ 编译器(vc142 工具链/msvs2019、Win10)方面存在非常奇怪的问题:每次任何 GUI 应用程序启动 c++ 编译器 (cl.exe) 时,它都会打开新的控制台窗口。

由于编译器正在被 IDE(例如 VisualStudio、CLion、QtCreator 等)使用,它非常没用,因为被调用者(IDE)无法捕获编译的输出,并且 IDE 不显示任何编译输出,特别是在出错的情况下编译消息。显然,这些 IDE 是通过 msbuild 或 cmake 等构建系统间接执行此操作的。无论如何,问题就在那里。

所以 NMake 或 MSBuild 无法正确使用,因为它们在单独的窗口中运行 cl.exe。我必须手动从命令行运行构建过程才能看到错误消息。

相同的工具链可以在其他 Win10 主机上正确使用。我看不出有什么区别...

知道为什么会发生这种情况以及如何解决吗?

附:可能这不是 cl 的问题,而是一些 Windows 终端设置...甚至是安全问题(我不是该主机上的管理员)

【问题讨论】:

大胆猜测,但您的PATH 中是否还有另一个cl.exe 不是正确的编译器? 我会检查一下,但一切正常,除了在单独的终端中 刚刚检查过 - 仅针对不同目标的 cl 编译器集,全部来自 VS2019 工具链 我建议你可以添加以下代码隐藏控制台窗口#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 你能解释一下这个原因吗?如果您认为我必须将其添加到我在 IDE 中编译的项目中,这是一个共享库,没有主入口点。你确定理解我的问题吗 - 这不是关于我在新控制台窗口中启动的示例应用程序(因为它是一个库),而是关于在自己的控制台中执行其工作的编译器本身 【参考方案1】:

对我们来说,这是一个企业间谍软件程序 BeyondTrust/PowerBroker for windows,它以某种方式使 cl.exe 行为不端。

PowerBroker 基本上接管了 UAC 控制并强制应用程序在特权模式或非特权模式下运行等。我不确定机制,但它以某种方式干扰了 cl.exe 写入 stderr 或 ninja.exe 的能力将 stderr 重定向到自身,或者 ninjas 能够将其通过管道传送到某处或某处。

无论如何,将白名单规则放入(或终止超出信任服务)使 VSCode 调用 cmake 调用 ninja 调用 cl.exe 行为正常。

编辑:更多详细信息:cmake.exeninja.execmd.exe 是需要豁免的进程BeyondTrust 的 PRIVMAN 可以从 VSCode 函数构建 cmake 而不会弹出窗口。

【讨论】:

以上是关于MSVC 编译器 (cl.exe) 启动新的控制台窗口。如何预防?的主要内容,如果未能解决你的问题,请参考以下文章

msvc + GNU 制作

与 MSVC++ 2010 编译器一起使用的调试器

在 MSYS 环境中使用 MSVC 工具链(例如:CL.EXE)时,如何避免“未解析的外部符号 _mainCRTStartup”错误?

错误:命令 'C:\\Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.14.26428\\bin\\HostX86\\x64\\cl.exe'

如何单独提取出MSVC2017编译器并在其他IDE使用

如何强制 cmake 在没有完整路径的情况下使用 cl.exe?