为什么我的Qt 4.5应用程序在Windows下打开控制台窗口?

我一直在Linux下玩Qt Creator 4.5。 我的应用程序在Linux下构build得很好,但如果我在Windows中构build,应用程序始终会在启动时打开控制台窗口。

我可以阻止它这样做吗?

我正在build立使用默认的MinGW设置,也许这​​是相关的。 如果需要的话,我可以使用Visual Studio构build,但是我想先了解发生的事情。

编辑 :我刚刚创build了一个简单的testingGUI应用程序与Windows下的Qt Creator,并没有performance出这种行为。 这种行为是因为在linux下创build项目的方式而发生的,或者是我的应用程序会导致控制台窗口出现。 当我诊断它时会发布详细信息,以防别人帮助其他人。

Solutions Collecting From Web of "为什么我的Qt 4.5应用程序在Windows下打开控制台窗口?"

简短的回答是,包括Qt testlib会导致控制台出现。 删除它使它消失。

为了进一步解释,如果.pro文件将testlib添加到QT,例如

QT += sql \ webkit \ network \ testlib 

那么最后的链接步骤是用这样的一条线进行的

 g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,console -o debug\MyApp.exe object_script.MyApp.Debug -L"c:\Qt\2009.01\qt\lib" -lglu32 -lgdi32 -luser32 -lQtWebKitd4 -lQtTestd4 -lQtSqld4 -lQtGuid4 -lQtNetworkd4 -lQtCored 

我们已经完成了使用控制台子系统! 我认为使用testlib强制这种情况发生,以便测试输出有一个地方去。

如果我们现在编辑.pro文件,并删除对testlib的引用和重建,我们得到这样的链接步骤

 g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\Ammotin.exe object_script.Ammotin.Debug -L"c:\Qt\2009.01\qt\lib" -lglu32 -lgdi32 -luser32 -lmingw32 -lqtmaind -lQtWebKitd4 -lQtSqld4 -lQtGuid4 -lQtNetworkd4 -lQtCored4 

好极了! 子系统是windows,没有更多的控制台窗口。

您将需要确保提供-mwindows开关。

编辑:

或者,您可以进入您的生成文件,并将其添加到您的链接器标志:

 -Wl,-subsystem,windows 

我认为这不是解决这个具体问题的答案(除了4年之后),但是我认为很多登陆这个主题的人都会寻找这个设置:

项目>构建并运行>运行设置>运行> [x]在终端中运行

取消选择它并从QtCreator运行您的GUI,而无需额外的终端窗口。 终端输出将被嵌入到IDE中。

确保您的.pro文件不会将console添加到变量CONFIG 你可以通过添加来做到这一点

 CONFIG -= console 

在.pro文件结尾的某处。 如果CONFIG包含console ,则每次启动程序时都会弹出一个窗口,打印调试输出时也会使用该窗口。 因此,在调试程序时添加console会很有用。 否则,您需要使用DebugView等工具来显示qDebug()调用的输出。

听起来像你的连接器设置是为控制台应用程序设置的。 你可以尝试设置链接器来使用/ subsystem:windows选项。 控制台应用程序的选项是/ subsystem:console。 如果您在Visual Studio中构建项目,请创建一个Win32项目。 不要创建一个Win32控制台应用程序。 在Visual Studio下用于设置子系统的选项在项目设置 – >链接器 – >系统 – >子系统下。 选择Windows(/ subsystem:windows)。

我看了一下如何用MinGW / gcc做到这一点。 gcc的联机文档显示了Windows目标的不同选项。 像其他人所说,你正在寻找的选项是-mwindows。 选项-mwindows创建一个窗口的应用程序。 看来你现在的设置是-mconsole。 选项-mconsole生成一个控制台应用程序。 这是一个链接器选项。 我不熟悉Qt Creator,但我猜它有类似的方式来查看像Visual Studio一样的项目设置。

我使用cmake而不是qmake。 我用set(CMAKE_CXX_FLAGS“-mwindows”)好像QMAKE_CXXFLAGS + = – 你的.pro文件中的mwindows会做同样的事情。

转到: Projects --> Run并取消选中Run in terminal复选框

对于那些通过像我这样的搜索引擎来到这里的人,我已经找到了真正的解决方案。 由我自己验证。

简而言之,您需要将“WIN32”添加到您的add_executable()语句中。

 add_executable( GuiApplication WIN32 src/main.cpp ) 

默认情况下,链接器假定你想要一个控制台应用程序。

解决的办法是在编译器的参数列表中添加“-mwindows”,这也将无形中添加所需的库(-lkernel32,-lgdi32等)。 您可能需要从main()更改为WinMain()作为入口点。

RE:编辑: Qt编译系统使用“spec”文件添加变量,你可以在$ QTDIR / qt / mkspecs中找到它们。 当您在QCreator中创建一个新的Windows应用程序时,它会将默认规范设置为“win32-g ++”,该规范会自动设置正确的变量(Windows应用程序,链接器标志等)。

当你在Linux下制作这个项目的时候,它使用了另一个规范,并且导致了你的问题。 您可以在“yourproject.pro.user”文件中看到当前的规范。

QT / 2009.05 / QT / mkspecs / Win32的克++
编辑文件qmake.conf
修改行
QMAKE_LFLAGS_CONSOLE = -Wl,-subsyetem,控制台

QMAKE_LFLAGS_CONSOLE = -Wl,-subsyetem,windows

并修改你的.pro文件(例如添加新的行或空格)
和编译
它的工作正常