1

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

我找到了这篇文章和这个答案

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

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

4

1 回答 1

7

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

  1. 设置(QT_USE_QMAIN 真)
  2. 包括(${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_QMAINinclude/QtGui/qwindowdefs.h在 Qt 源代码中定义。令人惊讶的是,它什么也没做,但是:

#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 可能会有所不同。

于 2013-08-31T22:29:47.193 回答