Why does my Qt 4.5 app open a console window under

2019-01-11 09:50发布

问题:

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.

回答1:

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.



回答2:

You will want to make sure the -mwindows switch is provided.

Edit:

alternatively, you can go into your makefile and add this to your linker flags:

-Wl,-subsystem,windows


回答3:

I think that this is not a solution for this specific answer (besides it is 4 years later), but I think that many people landing in this thread will be looking for this setting:

Projects > Build and Run > Run Settings > Run > [x] Run in terminal

De-select it and run your GUI from QtCreator without an extra Terminal window. Terminal output will be then embedded in the IDE.



回答4:

For those who have this issue using CMake, I've found the real solution here. Verified by myself.

In short, you need to add WIN32 to your add_executable() statements:

add_executable(GuiApplication WIN32 src/main.cpp)


回答5:

Make sure your .pro file doesn't add console to the variable CONFIG. You can do this by adding

CONFIG -= console

somewhere at the end of your .pro file. If CONFIG contains console a window pops up every time you start the program, and this is also used when printing debug output. Thus, adding console can be useful when debugging a program. Otherwise you'd need to use tools like DebugView to show the output of the qDebug() calls.



回答6:

Sounds like your linker settings are set for a console app. You could try setting the linker to use the /subsystem:windows option. The option for console applications is /subsystem:console. If you build your project in Visual Studio, create a Win32 Project. Don't create a Win32 Console App. The option under Visual Studio for setting the subsystem is under Project Settings->Linker->System->SubSystem. Select Windows(/subsystem:windows).

I took a look into how to do this with MinGW/gcc. The online docs for gcc shows the different options for Windows targets. Like other have stated, the option you are looking for is -mwindows. The option -mwindows creates a windowed app. It seems like your current setting is -mconsole. The option -mconsole produces a console app. This is a linker option. I'm not familiar with Qt Creator but I'm guessing it has a similar way to view project settings like Visual Studio has.



回答7:

I use cmake instead of qmake. I used set(CMAKE_CXX_FLAGS "-mwindows") seems as though QMAKE_CXXFLAGS +=-mwindows in your .pro file would do the same.



回答8:

Go to: Projects --> Run and uncheck Run in terminal checkbox



回答9:

By default the linker assumes you want a console application.

The fix is to add "-mwindows" to your compiler's argument list, and this will also invisibly add the required libraries (-lkernel32, -lgdi32, etc.). You'll probably need to change from main() to WinMain() as the entry point.

RE: your Edit: the Qt build system uses "spec" files to add variables, you can find them in $QTDIR/qt/mkspecs. When you create a new Windows app in QCreator, it sets the default spec to "win32-g++", which automatically sets the correct variables (windows app, linker flags, etc.).

When you made the project under Linux, it used another spec and that caused your issue. You can see the current spec in the "yourproject.pro.user" file.



回答10:

Qt/2009.05/qt/mkspecs/win32-g++
edit file qmake.conf
modify line
QMAKE_LFLAGS_CONSOLE = -Wl,-subsyetem,console
to
QMAKE_LFLAGS_CONSOLE = -Wl,-subsyetem,windows

and modify your ???.pro file (example add new line or space)
and compiling
it`s working ok