控制台 (/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 实现了这两个函数,而这些实现分别调用 main
和 WinMain
。因此,main
和WinMain
成为程序员的入口点,与链接器(几乎)无关。 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) 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章