根据链接 http://msdn.microsoft.com/en-us/library/fcc1zstk(v=vs.100).aspx
32 位应用程序假设使用 4.00(最低),64 位应用程序假设使用 5.02(最低)
但是我想从该链接中了解此参数和以下语句的意义/含义。
“子系统的选择会影响链接器将选择的入口点符号(或入口点函数)。”</p>
假
根据链接 http://msdn.microsoft.com/en-us/library/fcc1zstk(v=vs.100).aspx
32 位应用程序假设使用 4.00(最低),64 位应用程序假设使用 5.02(最低)
但是我想从该链接中了解此参数和以下语句的意义/含义。
“子系统的选择会影响链接器将选择的入口点符号(或入口点函数)。”</p>
假
简单地说:如果您正在编写一个需要指定的控制台应用程序,/SUBSYSTEM:CONSOLE
并且如果您正在编写一个不会自动打开控制台窗口的窗口应用程序,则需要/SUBSYSTEM:WINDOWS
. 其他子系统指定您的应用程序在内核模式下运行(但这并不简单),直接与硬件接口或在 Windows CE 设备上运行。
很少需要指定版本。
链接器创建的可执行文件仅根据此选项设置一个标志,负责启动应用程序的 Windows 函数检查此标志以确定如何启动应用程序(附加控制台窗口等)。
在你的程序中,你有main
,_tmain
等等WinMain
。这是你的程序开始的。然而,这不是程序启动的真正入口点,它只是一个从链接到程序的运行时调用的函数。在运行时,通常有一个特殊的函数在调用主函数之前进行一些初始化,这是文档中引用的“入口点”。
子系统设置似乎告诉链接器根据其设置使用不同的“入口点”功能。
子系统参数的主要意义是确定可执行文件将为哪个子系统构建;无论是控制台应用程序、Windows 应用程序、POSIX 应用程序、设备驱动程序等等。
根据文档,版本号指定可执行文件所需的最低操作系统(或子系统)版本。例如,如果您指定 6.0 (Windows Vista),那么理论上,Windows XP 将拒绝尝试运行可执行文件。我不确定这是否真的是真的,而且我认为以这种方式指定最低操作系统版本不是常见的做法。
对切入点的影响描述有点草率;更准确地说,子系统的选择会影响默认入口点。您可以使用参数覆盖此默认值/ENTRY
。
如下/ENTRY
所述,默认设置如下:
/SUBSYSTEM:CONSOLE
: mainCRTStartup (或 wmainCRTStartup)/SUBSYSTEM:WINDOWS
: WinMainCRTStartup (或 wWinMainCRTStartup)/DLL
: _DllMainCRTStartup它还说:“如果未指定 /DLL 或 /SUBSYSTEM 选项,则链接器会根据定义 main 或 WinMain 来选择子系统和入口点。”
IIRC,其他子系统没有默认入口点,您必须明确使用该/ENTRY
选项。