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.exe、ninja.exe 和 cmd.exe 是需要豁免的进程BeyondTrust 的 PRIVMAN 可以从 VSCode 函数构建 cmake 而不会弹出窗口。
【讨论】:
以上是关于MSVC 编译器 (cl.exe) 启动新的控制台窗口。如何预防?的主要内容,如果未能解决你的问题,请参考以下文章
在 MSYS 环境中使用 MSVC 工具链(例如:CL.EXE)时,如何避免“未解析的外部符号 _mainCRTStartup”错误?
错误:命令 'C:\\Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.14.26428\\bin\\HostX86\\x64\\cl.exe'