我试图使用 CMake、Qt 和 Visual Studio 构建一个不显示控制台窗口的可执行文件。
我找到了这篇文章和这个答案
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:mainCRTStartup")
但我想知道 QtCreator 是如何构建一个没有此 /ENTRY 标志的不显示控制台窗口的可执行文件的?
我试图使用 CMake、Qt 和 Visual Studio 构建一个不显示控制台窗口的可执行文件。
我找到了这篇文章和这个答案
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:mainCRTStartup")
但我想知道 QtCreator 是如何构建一个没有此 /ENTRY 标志的不显示控制台窗口的可执行文件的?
为了避免在使用 CMake 和 Visual Studio 的 Qt 项目中出现控制台窗口,CMakeLists.txt 中的四个条目是必需的:
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 可能会有所不同。