QtCreator如何在构建Windows应用程序时避开控制台窗口
How QtCreator is able to avoid the console window when building a Windows application?
我试图使用CMake、Qt和Visual Studio构建一个不显示控制台窗口的可执行文件。
我找到了这个帖子和这个答案
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:mainCRTStartup")
但我想知道QtCreator是如何构建一个没有这个/ENTRY标志就不会显示控制台窗口的可执行文件的?
为了避免在使用CMake和Visual Studio的Qt项目中出现控制台窗口,CMakeLists.txt中需要四个条目:
- SET(QT_USE_QMAIN为真)
- INCLUDE(${QT_USE_FILE})
- ${QT_LIBARIES}
- 将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可能有所不同。
相关文章:
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- 如何获取控制台窗口的宽度?
- 在C++中隐藏键盘记录器的控制台窗口
- C++ 如何在 OpenGL 程序中远程调用控制台窗口
- 为什么调试时没有显示控制台窗口
- 有没有办法像动画一样移动控制台窗口?
- 如何在C++中居中输出控制台窗口
- 控制台窗口未在开发C++中打开?即使也有 getch() ?
- QTextEdit 提升为构建控制台窗口
- 如何拒绝一个叫做的过程以写入继承的控制台窗口
- Visual C 关闭文本文件和打开新的控制台窗口
- 有没有办法为使用 Boost 生成的进程创建新的控制台窗口
- C++:显示控制台窗口的输出
- C++:如何在控制台窗口中显示结果
- (C++)控制台窗口保持立即关闭,即使我在Visual Studio中是CTRL + F5
- 如何在调用系统()时隐藏控制台窗口
- 在控制台窗口关闭(在Windows上)上优雅地关闭命令行应用程序
- C++控制台窗口放在前面
- C++/CLI 项目如何在控制台窗口中显示消息