Why does my Qt 4.5 app open a console window under Windows?

Paul Dixon picture Paul Dixon · Apr 17, 2009 · Viewed 21.4k times · Source

I've been playing around with Qt Creator 4.5 under Linux. My application builds just fine under Linux, but if I build in Windows, the app always opens a console window at startup.

Can I stop it doing that?

I'm building using the default MinGW setup, perhaps that is related. If need be I can build with Visual Studio, but I'd like to understand what is happening first...

Edit: I just created a simple test GUI app with Qt Creator under Windows and it didn't exhibit this behaviour. Either this behaviour has occurred because of the way the project was created under linux, or there is something my app does which causes the console window to appear. Will post details when I diagnose it in case it helps someone else.

Answer

Paul Dixon picture Paul Dixon · Apr 20, 2009

The short answer is that including the Qt testlib causes the console to appear. Removing it makes it go away.

To explain further, if your .pro file adds testlib to QT, e.g.

QT += sql \
    webkit \
    network \
    testlib

then the final link step is carried out with a line like this

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

We've wound up using the console subsystem! I presume using testlib forces this to happen so that the test output has somewhere to go.

If we now edit the .pro file and remove the reference to testlib and rebuild, we get a link step like this

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

Yay! subsystem is windows, no more console window.