2011-05-13 12 views
5

En Visual C++, he jugado con Glut/FreeGlut/GLFW. Parece que todos estos proyectos agregan una ventana de CMD por defecto. Traté de sacarlo pasar por debajo de:¿Quitar la ventana de la consola para Glut/FreeGlut/GLFW?

Properties->C/C++->Preprocessor->Preprocessor Definitions

A partir de aquí, me quito el _CONSOLE y reemplazarlo con _WINDOWS

Luego fui en:

Properties->Linker->System->SubSystem

Y puse la opción de Windows (/ SUBSYSTEM: WINDOWS)

Luego, cuando intento compilar bajo GLFW, obtengo los siguientes errores de compilación:

  • de error 1 error LNK2001: sin resolver símbolo externo _WinMain @ 16 MSVCRT.LIB

  • error 2 error grave LNK1120: 1 externos sin resolver glfwWindow.exe

¿Es posible quitar la ventana de la consola?

Respuesta

6

Las aplicaciones de Windows que no son de consola utilizan la convención de punto de entrada WinMain(). Sus ejemplos de Glut probablemente utilicen la convención estándar C main().

Si quiere una solución rápida solo para la aplicación de demostración, la función WinAPI FreeConsole() podría ayudar.

MSDN: http://msdn.microsoft.com/en-us/library/ms683150(v=vs.85).aspx

+0

Esto funcionó, y lo anotaré con seguridad, pero sería bueno tener una forma de plataforma X de hacerlo. ¡Gracias de nuevo! – Johnathan

+2

Bueno, realmente no tienes el mismo problema en otras plataformas, así que te sugiero que envuelvas FreeConsole() en un bloque #ifdef WIN32/#endif. –

+0

¿Está diciendo que en Linux y Mac, no tienen una ventana de consola por defecto? – Johnathan

0

Si crea un nuevo proyecto como una aplicación de consola, siempre se ejecutará como tal. Debe crear un nuevo proyecto de GUI si desea ejecutarlo en una ventana real; de lo contrario, no se incluirán los encabezados y bibliotecas correctos.

También se incluirá la función WinMain requerida en los archivos de plantilla resultantes.

1

tiene que escribir un punto de entrada WinMain y copiar su código existente (de main):

int CALLBACK WinMain(
    __in HINSTANCE hInstance, 
    __in HINSTANCE hPrevInstance, 
    __in LPSTR lpCmdLine, 
    __in int nCmdShow 
){ 
    // ... 
} 
+0

Ok, veo lo que quieres decir, pero necesitaría un método multiplataforma de hacer esto. Probablemente tendré que ir con lo que dijo onteria_. Voy a dar una oportunidad. Gracias por la gran respuesta sin embargo. – Johnathan

+1

Yo solía tener un WinMain para convertidor principal. De esta manera, su aplicación proporciona ambos puntos de entrada. Solo necesita convertir la línea de comando de 'lpCmdLine' a' argc', 'argv'. – tibur

+0

No estoy muy seguro de lo que quieres decir con eso. ¿Es algo que debo proporcionar a una función o una bandera para Visual Studio? – Johnathan

0

Cuando he recibido un error como que yo era capaz de solucionarlo mediante la introducción de texto en que, tras el enlazador, sección Avance, opción punto de entrada lo siguiente:

main

+0

Eso resolvió la advertencia de error, pero no se colgó y me llevó a atonexit.c – Johnathan

+0

Me sorprende que haya funcionado. AFAIK que la configuración solo se refiere al nombre del método de punto de entrada, pero no cambia la firma en absoluto. Básicamente estás llamando() (HINSTANCE, HINSTANCE, LPSTR, int) a() (char **, int), que seguramente va a jugar al infierno con tu pila de llamadas cuando regrese ese método. –

12

En las opciones del enlazador, establece su punto de entrada a mainCRTStartup. Esta función realiza la configuración necesaria de MS libc y luego llama a main.

+3

combinando tu respuesta y @ Emre's funcionó para mí. – Sisyphus

+0

Funciona como un encanto combinado con la respuesta de @ Emre. Gracias. –

7

La mayoría de los vinculadores admiten opciones que eliminan automáticamente el código de inicio de la consola.

creo en GCC se llama -mwindows

+0

+1 porque tenía WinMain, pero la consola seguía abriéndose. – scones

8

Mi proyecto acaba de un main, (sin WinMain) y para desactivar la consola, que acaba de establecer Linker-> Sistema-> subsistema "Windows (/SUBSYSTEM:WINDOWS)" en lugar de "Console (/SUBSYSTEM:CONSOLE) "y la consola se va.

No necesita meterse con las definiciones del preprocesador para quitar la ventana de la consola.

Sé que mi respuesta es unos años tarde, pero espero que ayude.

+0

Intenté esto, pero en VS2015 da un error de enlazador: el símbolo externo no resuelto WinMain al que se hace referencia en la función "int __cdecl invoke_main (void)" –

1

para deshacerse de la consola con cmake, las banderas de enlace se establecen de la siguiente manera:

set_target_properties(exe_name PROPERTIES 
    LINK_FLAGS "/ENTRY:mainCRTStartup /SUBSYSTEM:WINDOWS") 
Cuestiones relacionadas