QtCreator如何在构建Windows应用程序时避开控制台窗口

How QtCreator is able to avoid the console window when building a Windows application?

本文关键字:控制台 窗口 应用程序 Windows 构建 QtCreator      更新时间:2023-10-16

我试图使用CMake、Qt和Visual Studio构建一个不显示控制台窗口的可执行文件。

我找到了这个帖子和这个答案

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:mainCRTStartup")

但我想知道QtCreator是如何构建一个没有这个/ENTRY标志就不会显示控制台窗口的可执行文件的?

为了避免在使用CMake和Visual Studio的Qt项目中出现控制台窗口,CMakeLists.txt中需要四个条目:

  1. SET(QT_USE_QMAIN为真)
  2. INCLUDE(${QT_USE_FILE})
  3. ${QT_LIBARIES}
  4. 将WIN32添加到Add_EXECUTABLE

ADD_EXECUTABLE看起来是这样的:

     ADD_EXECUTABLE(YourProject WIN32
           ...stuff...
     )

对于Visual Studio,所有四个步骤都是必需的。对于MinGW来说,第4步似乎就足够了。步骤1必须在步骤2之前

这些步骤的作用是什么?

QT_USE_QMAIN在QT源的include/QtGui/qwindowdefs.h中定义。令人惊讶的是,它什么都不做,但:

#if defined(QT_NEEDS_QMAIN)
#define main qMain
#endif

由此,Qt定义了自己的切入点。当然,这需要在某个地方定义qMain。因此,有必要包含一个额外的库,称为QtMain.lib。

步骤2是查找库的常见CMake方法。在这种情况下,它包括:path/cmake-2.8/Modules/UseQt4.cmake(Qt4)。

步骤3实际上链接了找到的QtMain.lib.

步骤4导致Windows使用/subsystem:Windows而不是/subsystem:console

这件事的好处是,在MinGW下,步骤1-3可能不是必要的,但也没有坏处。因此,无需区分Visual Studio和MinGW。然而,我只测试了Qt4。Qt5可能有所不同。