How QtCreator is able to avoid the console window when building a Windows application?
我试图使用不显示控制台窗口的CMake,Qt和Visual Studio构建可执行文件。
我发现这篇文章和这个答案
1
| set(CMAKE_EXE_LINKER_FLAGS"${CMAKE_EXE_LINKER_FLAGS} /ENTRY:mainCRTStartup") |
但我想知道QtCreator如何能够构建一个没有此/ ENTRY标志的可执行文件但不显示控制台窗口?
-
我不知道你的问题到底是什么。 从资源管理器启动时,同一个二进制文件是否打开控制台,而在QtCreator中启动时则不会? 原因是QtCreator在自己的控制台中启动它(作为Application Output窗口包含在GUI中)。 非常类似于您自己使用cmd打开控制台并从那里启动它。
-
我的问题是,当通过资源管理器运行时,使用qt creator创建的二进制文件不会打开控制台,因为它在链接应用程序时不提供/ entry标志。
要避免使用CMake和Visual Studio的Qt项目中的控制台窗口,CMakeLists.txt中的四个条目是必需的:
SET(QT_USE_QMAIN为true)
包括:($ {} QT_USE_FILE)
$ {} QT_LIBARIES
将WIN32添加到ADD_EXECUTABLE
ADD_EXECUTABLE看起来像这样:
1 2 3
| ADD_EXECUTABLE(YourProject WIN32
...stuff...
) |
对于Visual Studio,所有四个步骤都是必需的。对于MinGW,步骤4似乎就足够了。步骤1必须在步骤2之前。
这些步骤有什么作用?
QT_USE_QMAIN在Qt源中的include/QtGui/qwindowdefs.h中定义。令人惊讶的是它没有别的,但是:
1 2 3
| #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而不是plain main。
-
解决了我的问题。我用它编译的程序,不再显示任何控制台窗口。但我不使用Visual Studio,而是使用MinGW。不知道这是否有所作为。
-
是的,它确实。 Visual Studio尝试使用WinMain入口函数。我必须在问题中设置CMAKE_EXE_LINKER_FLAGS,但我仍然不知道Qt创建者构建如何不能显示控制台。
-
这是有趣的。我记住这一点。但我怀疑QtCreator做了什么特别的事。它创建一个项目文件并将其传递给编译器。它不应该有任何特殊的权力。它只是各种开发工具的前端。无论它从CMakeLists.txt创建的是什么,都应该与使用cmake工具完成时相同。
-
在INCLUDE($ {QT_USE_FILE})之前添加SET(QT_USE_QMAIN为true)并在执行此答案后执行$ {QT_LIBARIES}链接。
-
@drescherjm,这个变量究竟来自哪里?我搜索谷歌:一个独特的打击。使用此变量并不多说。在kitware上搜索:没什么。如果这真的解决了McLearys的问题,你应该把它作为一个正确的答案。似乎非常罕见。
-
我找到了。在Qt来源:includeQtGuiqwindowdefs.h:#if defined(QT_NEEDS_QMAIN)。正如我所说:如果真的有效,那就需要一个好的答案。关于这个定义的文档非常薄。
-
我上周必须解决同样的问题。我隐约记得需要QTMAIN来解决主链接,所以我用Google搜索,这导致我在我的CMakeLists.txt中启用QT_USE_QMAIN
-
任何人都是志愿者发布正确的答案?如果没有人可以自己发布答案,那么需要记录下来。
-
它有用吗?虽然我目前没有使用Visual Studio,但我对这样的东西很感兴趣。
-
如果没有人打败我,我会在几个小时内做到这一点。现在睡觉时间。如果我能为MinGW和Visual Studio提供相同的解决方案,我想尝试一下。 MinGW不需要QT_USE_QMAIN。但它会很好,如果它仍然存在并不重要,那么就没有必要区分编译器。