2010-05-02 15 views
8

che sto seguendo il tuto:Qual è l'equivalente dell'opzione -mwindows di gcc in cmake?

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

Funziona ma ogni volta che fare doppio clic sul file eseguibile, v'è una console che io non lo voglio lì.

Come si elimina questa console?

ho provato questo:

add_executable(Cmd WIN32 cmd.c) 

ma ho ottenuto questo errore fatale:

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

Mentre si utilizza gcc lavora direttamente:

gcc -o Cmd cmd.c -mwindows .. 

Sto indovinando che ha qualcosa a che fare con la funzione di inserimento: int main(int argc, char *argv[]), ma perché gcc funziona?

Come posso farlo funzionare con cmake?

UPDATE

Permettetemi di incollare il codice sorgente qui per comodità:

#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

Perché gcc -mwindows opere ma add_executable(Cmd WIN32 cmd.c) no?

Forse non è l'equivalente per -mwindows in cmake?

risposta

2

Se si desidera eseguire il programma in modalità console (ad esempio una funzione main), è necessario specificarlo nelle proprietà del progetto in MSVC. Quello che stai usando in questo momento è un progetto in modalità finestra (cioè una funzione WinMain, che non hai, quindi l'errore).

Ma se non si desidera ottenere la finestra della console brutta, si desidera utilizzare la modalità finestra (ad esempio, trasformare la funzione main in una funzione propper WinMain). In questo modo la tua finestra normale è tutto ciò che mostrerà.

modifica: Come parte, in realtà non dovresti nominare il tuo programma "cmd", questo è il nome dell'interprete dei comandi di Windows.

+0

Ma posso usare gcc per costruire una finestra con "main", perché non si può 'cmake'? A proposito, puoi elaborare una funzione 'WinMain' propper? Ho provato a cambiare 'main' in' WinMain' ma non funziona ancora. – Gtker

+0

'int main (int, char **)' è la versione della console del punto di ingresso. 'int WinAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)' è la versione con finestra del punto di ingresso. – Blindy

+0

Sulla tua prima domanda, cmake fa esattamente quello che dici di fare. Non dovresti chiedere "perché non puoi fare?", Dovresti chiedere "perché non posso dire a cmake di ...?". – Blindy

1

Secondo il 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.

Tuttavia, punto di ingresso del vostro programma è main() e non WinMain(). Quello che dovresti fare, invece, è omettere il flag WIN32, ma devi collegarti a libgtk. Quindi, si può usare 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

Grazie. Ho provato le tue 2 soluzioni, ma nessuna funziona. La prima genera ancora una console, e la seconda riporta: 'cl: avviso riga di comando D9002: ignorando l'opzione sconosciuta '-mwindows'' – Gtker

+0

@Michael Aaron Safyan, I hai incollato il codice sopra, puoi dare un'occhiata? – Gtker

+0

@Runner, mi dispiace, ma non ho una copia di Windows su cui testare ... Conosco CMake, ma non tanto con Windows. Forse, se tu potessi mostrarmi la documentazione per il flag "-mwindows", potrei essere in grado di capire l'equivalente di CMake. –

4

add_executable (Cmd WIN32 cmd.c)

Indica CMake questo è un programma per Windows, e cerca invece di WinMain principale.Se vuoi vedere le bandiere in uso puoi eseguire make VERBOSE = 1. La domanda potrebbe essere come definisci WinMain per le app gtk? So con Qt, ti colleghi in una libreria che lo definisce per te.

+0

Voglio raggiungere il mio obiettivo 'cmake' senza cambiare' main' in 'WinMain', come' gcc -mwindows' ha fatto. – Gtker

2

È possibile impostare questi flag per il linker di avere un punto di ingresso main() e nessun console:

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

Per ulteriori informazioni, vedere this answer per le bandiere linker, e this answer per come impostare le bandiere in cmake.

Problemi correlati