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

McL*_*ary 1 c++ qt cmake visual-studio windows-console

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

我发现这篇文章和这个答案

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:mainCRTStartup")
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*low 7

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

  1. SET(QT_USE_QMAIN为true)
  2. 包括:($ {} QT_USE_FILE)
  3. $ {} QT_LIBARIES
  4. 将WIN32添加到ADD_EXECUTABLE

ADD_EXECUTABLE看起来像这样:

     ADD_EXECUTABLE(YourProject WIN32
           ...stuff...
     )
Run Code Online (Sandbox Code Playgroud)

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

这些步骤有什么作用?

QT_USE_QMAIN include/QtGui/qwindowdefs.h在Qt源中定义.令人惊讶的是它没有别的,但是:

#if defined(QT_NEEDS_QMAIN)
#define main qMain
#endif
Run Code Online (Sandbox Code Playgroud)

有了这个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可能有所不同.

  • @drescherjm,这个变量究竟来自哪里?我搜索谷歌:一个独特的打击.不要说'使用这个变量'.在kitware上搜索:没什么.如果这真的解决了McLeary的问题,你应该做出正确的答案.似乎**非常罕见. (2认同)
  • 我上周必须解决同样的问题.我隐约记得需要QTMAIN来解决主链接,所以我用Google搜索,这导致我在我的CMakeLists.txt中启用QT_USE_QMAIN (2认同)