【问题标题】:How QtCreator is able to avoid the console window when building a Windows application?QtCreator 在构建 Windows 应用程序时如何避免控制台窗口?
【发布时间】:2013-08-31 21:48:49
【问题描述】:

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

我找到了这篇文章和this 的答案

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

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

【问题讨论】:

  • 我不知道你的问题到底是什么。当您从资源管理器启动时,相同的二进制文件是否会打开一个控制台,而当您在 QtCreator 中启动它时却没有?原因是 QtCreator 在自己的控制台中启动它(作为应用程序输出窗口包含在 GUI 中)。就像您自己使用 cmd 打开控制台并从那里启动它一样。
  • 我的问题是使用 qt creator 构建的二进制文件在通过资源管理器运行时如何打开控制台,因为它在链接应用程序时不提供 /entry 标志。跨度>

标签: c++ visual-studio qt cmake windows-console


【解决方案1】:

为了避免在使用 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...
     )

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

【讨论】:

  • 只有这样并不能解决问题,因为入口点仍然是 winmain 而不是普通的 main。
  • 解决了我的问题。我用它编译的程序不再显示任何控制台窗口。但我不使用 Visual Studio,而是使用 MinGW。想知道这是否会有所作为。
  • @drescherjm,这个变量到底是从哪里来的?我搜索谷歌:一个独特的点击。只说“使用这个变量”。在套件上搜索:没有。如果这真的解决了 McLeary 的问题,你应该把它作为一个正确的答案。似乎非常很少见。
  • 我找到了。在 Qt 源代码中:include/QtGui/qwindowdefs.h:#if defined(QT_NEEDS_QMAIN)。正如我所说:如果这真的有效,它需要一个好的答案。关于这个定义的文档非常薄。
  • 上周我不得不解决同样的问题。我隐约记得需要 QTMAIN 来解决 main 的链接,所以我搜索了一下,这导致我在 CMakeLists.txt 中启用了 QT_USE_QMAIN
猜你喜欢
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多