控制台 (/SUBSYSTEM:CONSOLE) 和 Windows (/SUBSYSTEM:WINDOWS) 之间的区别

Posted

技术标签:

【中文标题】控制台 (/SUBSYSTEM:CONSOLE) 和 Windows (/SUBSYSTEM:WINDOWS) 之间的区别【英文标题】:difference between Console (/SUBSYSTEM:CONSOLE) and Windows (/SUBSYSTEM:WINDOWS) 【发布时间】:2011-09-06 07:36:47 【问题描述】:

有人可以解释一下 Visual Studio 2008 中链接器属性中这两个声明之间的区别(请尽可能简单,我是 C++ 世界的新手)提前谢谢

编辑:如果可以的话,请给我两个小程序来显示效果

【问题讨论】:

相关话题:***.com/questions/11716350/… 【参考方案1】:

/SUBSYSTEM:CONSOLE) 用于基于控制台的应用程序。您应该在代码中定义main 函数。

/SUBSYSTEM:WINDOWS) 用于 GUI 应用程序。你应该定义WinMain函数。

【讨论】:

SUBSYSTEM:WINDOWS 不一定适用于 GUI 应用程序。仅适用于没有控制台的应用程序。想想服务器应用程序,无头运行的服务。 如果从 MSVC 2013 命令行面向 Windows XP,您可能需要 /SUBSYSTEM:WINDOWS,5.1(或 :CONSOLE,5.1) @DavidHeffernan SUBSYSTEM:WINDOWS 也不一定适用于 GUI 应用程序。如果需要控制台,它可以调用 AllocConsole()。发生的情况是 /SUBSYSTEM:CONSOLE 控制台设置(我认为 stdout/stdin 设置)会自动发生。所以 /SUBSYSTEM:WINDOWS 适用于没有自动分配控制台的应用 未指定 /SUBSYSTEM(即在 Visual Studio 中选择 NOT SET)的 DLL 仍将 SUBSYSTEM 字段设置为 Windows GUI。检查:***.com/questions/11716350/…【参考方案2】:

CONSOLE:显示控制台窗口。 WINDOWS - 程序在没有控制台窗口的情况下启动。

已编辑,正在查看其他答案。请注意 /SUBSYSTEM 标志不会影响程序入口点。程序入口点由 /ENTRY 链接器选项定义。通常 /SUBSYSTEM:CONSOLE 有“main”入口点,而 /SUBSYSTEM:WINDOWS 有“WinMain”入口点。但是,例如,可以使用 WinMain 入口点和控制台窗口创建 GUI 应用程序。

【讨论】:

/subsystem:console 的默认入口点是 [w]mainCRTStartup/subsystem:windows 的默认入口点是 [w]WinMainCRTStartup。恰巧 CRT 实现了这两个函数,而这些实现分别调用 mainWinMain。因此,mainWinMain 成为程序员的入口点,与链接器(几乎)无关。 docs.microsoft.com/en-us/cpp/build/reference/… 似乎与官方文档所说的有些相反:“子系统的选择会影响链接器将选择的入口点符号(或入口点函数)”。 @Sam 实际上/SUBSYSTEM 有几个值。选择不同的会导致链接器搜索不同的符号。【参考方案3】:

见here。 VS2008 为您自动执行了一些导致混乱的事情。

CONSOLE Win32 字符模式应用程序。操作系统 为控制台应用程序提供控制台。如果 main 或 wmain 是 为本机代码定义, int main(array ^) 定义为 托管代码,或者您完全使用 /clr:safe,CONSOLE 是默认设置。

WINDOWS 应用程序不需要控制台,可能是因为它创建了自己的窗口来与用户交互。如果 WinMain 或 wWinMain 是为本机代码定义的,或 WinMain(HISTANCE *, HINSTANCE *, char *, int) 或 wWinMain(HINSTANCE *, HINSTANCE *, wchar_t *, int) 是为托管代码定义的,WINDOWS是默认值。

【讨论】:

【参考方案4】:

/SUBSYSTEM:CONSOLE 产生一个带有控制台的进程,而 /SUBSYSTEM:WINDOWS 没有。

【讨论】:

这并不完全正确。例如。 /SUBSYSTEM:WINDOWS 的进程如果调用AllocConsole(),则可以有一个控制台

以上是关于控制台 (/SUBSYSTEM:CONSOLE) 和 Windows (/SUBSYSTEM:WINDOWS) 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

在vs中开发QT时,控制台无输出

将控制台应用程序转换为 Windows 应用程序

如何检测编译程序时使用的子系统?

将控制台应用程序转换为Windows应用程序

日记2

VS2013中,将Qt的GUI程序改为控制台程序