/ SUBSYSTEM参数的意义 - msdn

时间:2013-01-16 07:57:06

标签: c++ c windows sdk operating-system

根据链接 http://msdn.microsoft.com/en-us/library/fcc1zstk(v=vs.100).aspx

32位app假设使用4.00(最小)而64位app假设使用5.02(最小)

但我想了解这个参数的意义/含义以及该链接的以下声明。

“子系统的选择会影响链接器将选择的入口点符号(或入口点函数)。”

深水

3 个答案:

答案 0 :(得分:4)

简单地说:如果您正在编写控制台应用程序,则需要指定/SUBSYSTEM:CONSOLE,如果您正在编写一个不会自动打开控制台窗口的窗口应用程序,则需要/SUBSYSTEM:WINDOWS。其他子系统指定您的应用程序以内核模式运行(但这不是简单的可能),直接与硬件接口或在Windows CE设备上运行。

很少需要指定版本。

链接器创建的可执行文件只是根据此选项设置了一个标志,负责启动应用程序的Windows函数检查此标志以确定如何启动应用程序(连接控制台窗口等)。

答案 1 :(得分:0)

在您的计划中,您有main_tmainWinMain等。这是您的计划开始。但是,这不是程序启动的 true 入口点,它只是从链接到程序的运行时调用的函数。在运行时,通常会有一个特殊的函数在调用main函数之前进行一些初始化,这是文档中引用的“入口点”。

子系统设置似乎告诉链接器根据其设置使用不同的“入口点”功能。

答案 2 :(得分:0)

子系统参数的主要意义是确定将为哪个子系统构建可执行文件;它是控制台应用程序,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选项。