2010-05-02 5 views
8

Ich bin nach dem tuto:Was entspricht der gcc-Option -mwindows in cmake?

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

Es funktioniert, aber jedes Mal, wenn ich auf die ausführbare Datei doppelklicken, gibt es eine Konsole, die ich es dort nicht wollen.

Wie werde ich diese Konsole loswerden?

Ich versuchte dies:

add_executable(Cmd WIN32 cmd.c) 

aber bekam diesen fatalen Fehler:

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

Während direkt arbeitet mit gcc:

gcc -o Cmd cmd.c -mwindows .. 

Ich vermute, es ist etwas zu tun hat mit der Eintragsfunktion: int main(int argc, char *argv[]), aber warum gcc funktioniert?

Wie kann ich es mit cmake arbeiten lassen?

UPDATE

Lassen Sie mich den Quellcode einfügen hier der Einfachheit halber:

#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

Warum gcc -mwindows funktioniert, aber add_executable(Cmd WIN32 cmd.c) nicht?

Vielleicht ist das nicht gleichbedeutend für -mwindows in cmake?

Antwort

2

Wenn Sie möchten, dass Ihr Programm im Konsolenmodus ausgeführt wird (dh eine main-Funktion), müssen Sie es in den Projekteigenschaften in MSVC angeben. Was Sie gerade verwenden, ist ein Projekt im Fenstermodus (dh eine WinMain Funktion, die Sie nicht haben, daher der Fehler).

Aber wenn Sie nicht wollen, um das hässliche Konsolenfenster zu bekommen, möchten Sie den Fenstermodus verwenden (dh transformieren Sie Ihre main Funktion in eine funktionsfähige WinMain Funktion). Auf diese Weise wird nur das normale Fenster angezeigt.

edit: Nebenbei sollten Sie Ihr Programm nicht wirklich "cmd" nennen, das ist der Name des Befehlsinterpreters von Windows.

+0

Aber ich kann gcc verwenden, um ein Fensterprogramm mit 'main' zu erstellen, warum kann' cmake' nicht? Übrigens, können Sie näher erläutern, was eine "WinMain" -Funktion ist? Ich habe versucht, 'main' in' WinMain' zu ändern, funktioniert aber immer noch nicht. – Gtker

+0

'int main (int, char **)' ist die Konsolenversion des Einstiegspunktes. 'int WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)' ist die gefensterte Version des Einstiegspunktes. – Blindy

+0

Über deine erste Frage, cmake macht genau das, was du sagst. Sie sollten nicht fragen "Warum kann nicht cmake?", Sollten Sie fragen "Warum kann ich nicht sagen CMKE zu ...?". – Blindy

1

Nach dem 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.

Allerdings ist Ihr Programm Eintrittspunkt main() und nicht WinMain(). Was Sie stattdessen tun sollten, ist das WIN32-Flag weglassen, aber Sie müssen mit libgtk verknüpfen. So würden Sie TARGET_LINK_LIBRARIES verwenden:

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

Danke. Ich habe Ihre 2 Lösungen ausprobiert, aber keine funktioniert. Die erste erzeugt immer noch eine Konsole, und die zweite meldet: 'cl: Befehlszeilen-Warnung D9002: unbekannte Option '-mwindows' ignorieren – Gtker

+0

@Michael Aaron Safyan, I habe den Code oben eingefügt, können Sie einen Blick darauf werfen? – Gtker

+0

@Runner, sorry, aber ich habe keine Kopie von Windows, auf dem zu testen ... Ich bin vertraut mit CMake, aber nicht so sehr mit Windows. Wenn Sie mir vielleicht die Dokumentation für die "mwindows" -Flagge zeigen könnten, könnte ich vielleicht das CMake-Äquivalent herausfinden. –

4

add_executable (Cmd WIN32 cmd.c)

Tells CMake das ist ein Windows-Programm, und es sieht für WinMain statt Haupt.Wenn Sie die verwendeten Flags sehen möchten, können Sie make VERBOSE = 1 ausführen. Die Frage könnte sein, wie definieren Sie WinMain für GTK-Anwendungen? Ich weiß mit Qt, Sie verknüpfen in einer Bibliothek, die es für Sie definiert.

+0

Ich möchte mein Ziel erreichen durch 'cmake', ohne' main' in 'WinMain' zu ändern, wie' gcc -mwindows'. – Gtker

2

Sie können diese Linker-Flags gesetzt einen main() Eintrittspunkt haben und keine Konsole:

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

Für mehr Informationen, this answer für die Linker-Flags sehen, und this answer, wie in cmake Flags zu setzen.