2009-04-17 27 views
26

He estado jugando con Qt Creator 4.5 bajo Linux. Mi aplicación se compila muy bien en Linux, pero si compilo en Windows, la aplicación siempre abre una ventana de consola al inicio.¿Por qué mi aplicación Qt 4.5 abre una ventana de consola en Windows?

¿Puedo detenerlo haciendo eso?

Estoy compilando usando la configuración predeterminada de MinGW, quizás eso esté relacionado. Si es necesario puedo construir con Visual Studio, pero me gustaría entender lo que está pasando en primer lugar ...

Editar: Acabo de crear una aplicación de interfaz gráfica de usuario sencilla prueba con Qt Creator en Windows y no lo hizo exhibir este comportamiento. O este comportamiento se ha producido debido a la forma en que se creó el proyecto en Linux, o hay algo que hace mi aplicación que hace que aparezca la ventana de la consola. Publicaré detalles cuando lo diagnostique en caso de que ayude a otra persona.

Respuesta

17

La respuesta corta es que incluir el Qt testlib hace que aparezca la consola. Quitarlo lo hace desaparecer.

Para explicarlo más, si su archivo .pro agrega testlib a QT, p.

QT += sql \ 
    webkit \ 
    network \ 
    testlib 

entonces la etapa de enlace final se lleva a cabo con una línea como esta

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 

Hemos terminamos utilizando el subsistema de la consola! Supongo que usar testlib obliga a que esto suceda para que la salida de prueba tenga un lugar adonde ir.

Si ahora editamos el archivo .pro y eliminar la referencia a TestLib y reconstruir, obtenemos un paso enlace como este

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! subsistema es Windows, no hay más ventana de consola.

+1

Hola, no tengo 'testlib' en mi .pro, y tengo el mismo problema –

+1

Esta bandera funcionó en Qt 5.7' QT.testlib.CONFIG - = console' Pero esto 'CONFIG - = console' no funciona. – CroCo

7

Querrá asegurarse de que se proporciona el interruptor -mwindows.

Editar:

alternativamente, se puede entrar en el makefile y añadir esto a sus banderas enlazador:

-Wl,-subsystem,windows 
+0

¿Es eso algo que puedo establecer dentro de Qt Creator? –

+0

sí, lea mi edición también –

+0

Sería útil mostrar las banderas reales. – CroCo

3

suena como su configuración enlazador se establecen para una aplicación de consola. Podría intentar configurar el vinculador para usar la opción/subsystem: windows. La opción para aplicaciones de consola es/subsistema: consola. Si construye su proyecto en Visual Studio, cree un Proyecto Win32. No crees una aplicación de consola Win32. La opción en Visual Studio para configurar el subsistema está en Configuración del proyecto-> Enlazador-> Sistema-> Subsistema. Seleccione Windows (/ subsistema: windows).

Eché un vistazo a cómo hacer esto con MinGW/gcc. Los documentos en línea para gcc muestran las diferentes opciones para los objetivos de Windows. Al igual que otros han declarado, la opción que está buscando es -mwindows. La opción -mwindows crea una aplicación con ventana. Parece que su configuración actual es -mconsole. La opción -mconsole produce una aplicación de consola. Esta es una opción de engarce. No estoy familiarizado con Qt Creator, pero supongo que tiene una forma similar de ver la configuración del proyecto, como Visual Studio.

+0

Estas opciones son para el enlazador de Microsoft. – zooropa

+0

Sí, me gustaría entender por qué ocurre esto usando Mingw. –

0

De forma predeterminada, el vinculador supone que desea una aplicación de consola.

La solución es agregar "-mwindows" a la lista de argumentos de su compilador, y esto también agregará invisiblemente las bibliotecas necesarias (-lkernel32, -lgdi32, etc.). Probablemente necesites cambiar de main() a WinMain() como punto de entrada.

RE: su edición: el sistema de compilación Qt utiliza archivos "spec" para agregar variables, puede encontrarlas en $ QTDIR/qt/mkspecs. Cuando crea una nueva aplicación de Windows en QCreator, establece la especificación predeterminada en "win32-g ++", que establece automáticamente las variables correctas (aplicación de Windows, indicadores de enlazador, etc.).

Cuando realizó el proyecto en Linux, utilizó otra especificación y eso causó su problema. Puede ver la especificación actual en el archivo "yourproject.pro.user".

+0

No llama al punto de entrada WinMain en una aplicación Qt –

+0

OK, no estoy tan familiarizado con Qt. Se necesita un WinMain para las aplicaciones GUI en Windows, por lo que probablemente el framework implemente WinMain() y llame a su main() detrás de las escenas. Sin embargo, el resto de la publicación se mantiene. –

4

Asegúrate de que tu archivo .pro no agrega console a la variable CONFIG. Usted puede hacer esto mediante la adición de

CONFIG -= console 

en algún lugar al final de su archivo .pro.Si CONFIG contiene console, aparece una ventana cada vez que inicia el programa, y ​​esto también se utiliza al imprimir la salida de depuración. Por lo tanto, agregar console puede ser útil al depurar un programa. De lo contrario, necesitaría usar herramientas como DebugView para mostrar el resultado de las llamadas qDebug().

+0

no funciona .... – CroCo

0

Qt/2009.05/qt/mkspecs/win32-g ++
editar archivo qmake.conf
modifican línea
QMAKE_LFLAGS_CONSOLE = -Wl, -subsyetem, consola
a
QMAKE_LFLAGS_CONSOLE = -Wl, -subsyetem, ventanas

y modificar el archivo ???. (pro ejemplo, añadir nueva línea o espacio)
y compilar
`s de trabajo bien

2

Uso cmake en lugar de qmake. Utilicé set (CMAKE_CXX_FLAGS "-mwindows") parece que QMAKE_CXXFLAGS + = - mwindows en su archivo .pro haría lo mismo.

+1

Esto funciona para una cadena de herramientas gcc, pero ¿qué pasa con el uso del compilador MSVC? (dice "opción desconocida -mwindows"). –

7

creo que esto no es una solución para esta respuesta específica (además de que es 4 años más tarde), pero creo que muchas personas que aterrizan en este hilo se busca para este ajuste:

Proyectos> Construir y Ejecutar> Configuración de ejecución> Ejecutar>[x] Ejecutar en la terminal

Deseleccionar y ejecutar su GUI desde QtCreator sin una ventana adicional de Terminal. La salida del terminal se integrará en el IDE.

+0

Gracias, esto es lo que me solucionó. –

+0

Me alegro de que haya ayudado a alguien :) – fbeeper

+0

justo lo que necesitaba. Gracias. –

1

Ir a: Projects --> Run y desactive la casilla de verificación Run in terminal

1

Para aquellos que llega aquí a través de motores de búsqueda como yo, que he encontrado la solución real here. Verificado por mí mismo.

En resumen, debe agregar "WIN32" a sus instrucciones add_executable().

add_executable(
    GuiApplication 

    WIN32 

    src/main.cpp 
) 
Cuestiones relacionadas