2010-05-02 11 views
8

que sigo el tuto:¿Cuál es el equivalente de la opción -mwindows de gcc en cmake?

http://zetcode.com/tutorials/gtktutorial/firstprograms/

Funciona, pero cada vez que hago doble clic en el archivo ejecutable, hay una consola de la que no quiero allí.

¿Cómo me deshago de esa consola?

yo probamos este:

add_executable(Cmd WIN32 cmd.c) 

Pero tiene este error fatal:

MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol [email protected] referenced in function ___tmainCRTStartup 
Cmd.exe : fatal error LNK1120: 1 unresolved externals 

bien la utilización de gcc trabaja directamente:

gcc -o Cmd cmd.c -mwindows .. 

supongo que tiene algo que ver con la función de entrada: int main(int argc, char *argv[]), pero ¿por qué funciona gcc?

¿Cómo puedo hacer que funcione con cmake?

ACTUALIZACIÓN

Déjame pegar el código fuente aquí por conveniencia:

#include <gtk/gtk.h> 

int main(int argc, char *argv[]) 
{ 
    GtkWidget *window; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_widget_show(window); 

    gtk_main(); 

    return 0; 
} 

Update2

Por qué gcc -mwindows funciona, pero no add_executable(Cmd WIN32 cmd.c)?

Quizás ese no sea el equivalente de -mwindows en cmake?

Respuesta

2

Si desea que su programa se ejecute en modo consola (es decir, una función main), se tiene que especificar en las propiedades de su proyecto en MSVC. Lo que estás usando ahora es un proyecto en modo ventana (es decir, una función WinMain, que no tienes, de ahí el error).

Pero si usted no quiere conseguir la ventana de la consola fea, que desea utilizar el modo de ventana (es decir, transformar su función main en una función propper WinMain). De esta forma, su ventana normal es todo lo que se mostrará.

editar: Como comentario aparte, no debería nombrar su programa "cmd", ese es el nombre del intérprete de comandos de Windows.

+0

Pero puedo usar gcc para crear un programa de ventana con 'main', ¿por qué no' cmake'? Por cierto, ¿puedes elaborar cuál es la función 'WinMain' adecuada? Intenté cambiar 'main' por' WinMain' pero aún no funcionaba. – Gtker

+0

'int main (int, char **)' es la versión de consola del punto de entrada. 'int WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)' es la versión en ventana del punto de entrada. – Blindy

+0

Acerca de su primera pregunta, cmake hace exactamente lo que le dice que haga. No debe preguntar "¿por qué no puedo hacer?", Debería preguntar "¿por qué no puedo decirle a cmake que ...?". – Blindy

1

De acuerdo con la CMake documentation for using the WIN32 flag with ADD_EXECUTABLE:

When this property is set to true the executable when linked on Windows will be created with a WinMain() entry point instead of of just main().This makes it a GUI executable instead of a console application. See the CMAKE_MFC_FLAG variable documentation to configure use of MFC for WinMain executables.

Sin embargo, el punto de entrada de su programa es main() y no WinMain(). Lo que debe hacer, en cambio, es omitir el indicador WIN32, pero debe vincularlo con libgtk. Por lo tanto, se usaría TARGET_LINK_LIBRARIES:

FIND_PACKAGE(GTK2 2.6 REQUIRED gtk) 
INCLUDE_DIRECTORIES(${GTK2_INCLUDE_DIRS}) 
LINK_DIRECTORIES(${GTK2_LIBRARIES}) 
ADD_EXECUTABLE(myprogramname source1 source2 ... sourceN) 
TARGET_LINK_LIBRARIES(myprogramname ${GTK2_LIBRARIES}) 
+0

Gracias.He probado sus 2 soluciones, pero ninguna funciona.La primera sigue generando una consola, y la segunda informa: 'cl: Advertencia de línea de comando D9002: ignorando la opción desconocida '-mwindows'' – Gtker

+0

@Michael Aaron Safyan, I He pegado el código de arriba, ¿puedes echarle un vistazo? – Gtker

+0

@Runner, lo siento, pero no tengo una copia de Windows para probar ... Estoy familiarizado con CMake, pero no tanto con Windows. Sin embargo, si pudiera mostrarme documentación para la bandera "-mwindows", podría descubrir el equivalente de CMake. –

4

add_executable (Cmd WIN32 cmd.c)

Le indica CMake este es un programa de Windows, y se ve por WinMain en lugar de principal.Si quiere ver que se usan las banderas, puede ejecutar make VERBOSE = 1. La pregunta podría ser ¿cómo defines WinMain para aplicaciones gtk? Sé que con Qt, enlazas en una biblioteca que lo define por ti.

+0

Quiero lograr mi objetivo 'cmake' sin cambiar' main' a 'WinMain', como' gcc -mwindows'. – Gtker

2

Puede establecer estas banderas de engarce a tener un punto de entrada main() y ninguna consola:

SET(CMAKE_EXE_LINKER_FLAGS 
    "${CMAKE_EXE_LINKER_FLAGS} /subsystem:windows /ENTRY:mainCRTStartup") 

Para obtener más información, ver this answer de las banderas de engarce, y this answer para saber cómo preparar banderas en cmake.

Cuestiones relacionadas