【问题标题】:Significance of /SUBSYSTEM parameter - msdn/SUBSYSTEM 参数的意义 - msdn
【发布时间】:2012-12-30 11:48:35
【问题描述】:

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

32 位应用程序假设使用 4.00(最低),64 位应用程序假设使用 5.02(最低)

但我想从该链接中了解此参数和以下语句的意义/含义。

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

假的

【问题讨论】:

  • 根据谷歌没有dlli_ntversion。此外,您的编辑使这成为一个完全不同的问题。我认为您应该回滚编辑并使用当前编辑的措辞提出一个新问题。

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


【解决方案1】:

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

很少需要指定版本。

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

【讨论】:

  • 我重新表述了我的问题。很抱歉。
【解决方案2】:

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

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

【讨论】:

  • 并非如此。入口点是相关的,但子系统告诉链接器选择了哪个 true 入口点,即如何在内存中创建程序。例如,它是连接到控制台还是创建自己的窗口。因此,不仅仅是确定应用程序的入口点,它还确定了应用程序的类型以及它可以从哪个上下文启动。
  • Hello People msdn 链接还说,我看到 4.00 和 5.02 值分别用于 32/64 位,这些是什么意思? msdn.microsoft.com/en-us/library/fcc1zstk(v=vs.100).aspx深水
【解决方案3】:

subsystem 参数的主要意义是确定可执行文件将为哪个子系统构建;无论是控制台应用程序、Windows 应用程序、POSIX 应用程序、设备驱动程序等等。

根据文档,版本号指定可执行文件所需的最低操作系统(或子系统)版本。例如,如果您指定 6.0 (Windows Vista),那么理论上,Windows XP 将拒绝尝试运行可执行文件。我不确定这是否真的是真的,而且我认为以这种方式指定最低操作系统版本不是常见的做法。

对入口点的影响描述有点草率;更准确地说,子系统的选择会影响 default 入口点。您可以使用 /ENTRY 参数覆盖此默认值。

/ENTRY 中所述,默认设置如下:

  • /SUBSYSTEM:CONSOLE: mainCRTStartup(或 wmainCRTStartup)
  • /SUBSYSTEM:WINDOWS: WinMainCRTStartup(或 wWinMainCRTStartup)
  • /DLL: _DllMainCRTStartup

它还说:“如果未指定 /DLL 或 /SUBSYSTEM 选项,则链接器会根据定义 main 或 WinMain 来选择子系统和入口点。”

IIRC,其他子系统没有默认入口点,您必须明确使用/ENTRY 选项。

【讨论】:

  • 我改写了我的问题,抱歉
  • 在同一个粘贴的 msdn 链接中,我看到 32/64 位分别给出了 4.00 和 5.02 值,这些是什么意思?
  • x64 代码的最低版本号是 5.2,因为在 Windows 版本 5.2(又名 Windows XP)之前,不支持 x64 平台。 (请注意,5.2 版与 5.02 版相同,只是格式不同。)
猜你喜欢
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
相关资源
最近更新 更多