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

时间:2009-04-17 13:02:10

标签: windows qt console mingw qt-creator

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

我可以阻止它吗?

我正在使用默认的MinGW设置构建,也许这是相关的。如果需要,我可以使用Visual Studio构建,但我想先了解发生了什么......

编辑:我刚刚在Windows下使用Qt Creator创建了一个简单的测试GUI应用程序,但它没有出现此行为。由于在linux下创建项目的方式,或者我的应用程序执行了导致控制台窗口出现的内容,因此发生了此行为。我会在诊断时发布详细信息,以防其他人帮助。

10 个答案:

答案 0 :(得分:17)

简短的回答是,包括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和rebuild的引用,我们会得到一个像这样的链接步骤

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,没有更多的控制台窗口。

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:8)

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

修改

或者,您可以进入makefile并将其添加到链接器标志:

-Wl,-subsystem,windows

答案 3 :(得分:5)

对于那些使用CMake有此问题的人,我找到了真正的解决方案here。由我自己验证。

简而言之,您需要在WIN32语句中添加add_executable()

add_executable(GuiApplication WIN32 src/main.cpp)

答案 4 :(得分:4)

确保您的.pro文件未将console添加到变量CONFIG。您可以通过添加

来完成此操作
CONFIG -= console

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

答案 5 :(得分:3)

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

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

答案 6 :(得分:3)

我使用cmake而不是qmake。我用过set(CMAKE_CXX_FLAGS“-mwindows”) 似乎好像 QMAKE_CXXFLAGS + = - mwindows 在您的.pro文件中也会这样做。

答案 7 :(得分:1)

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

答案 8 :(得分:0)

默认情况下,链接器假定您需要控制台应用程序。

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

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

当您在Linux下创建项目时,它使用了另一个规范,这导致了您的问题。您可以在“yourproject.pro.user”文件中查看当前规范。

答案 9 :(得分:0)

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

QMAKE_LFLAGS_CONSOLE = -Wl,-subsyetem,windows

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