2010-05-02 2 views
8

Je suis le tuto:Quel est l'équivalent de l'option -mwindows de gcc dans cmake?

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

Il fonctionne, mais chaque fois que je double clic sur l'exécutable, il y a une console que je ne veux pas là.

Comment se débarrasser de cette console?

J'ai essayé ceci:

add_executable(Cmd WIN32 cmd.c) 

Mais cette erreur fatale a obtenu:

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

Tout en utilisant gcc fonctionne directement:

gcc -o Cmd cmd.c -mwindows .. 

Je devine qu'il a quelque chose à faire avec la fonction d'entrée: int main(int argc, char *argv[]), mais pourquoi gcc fonctionne?

Comment puis-je le faire fonctionner avec cmake?

MISE À JOUR

Permettez-moi coller le code source ici pour des raisons pratiques:

#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; 
} 

MAJ2

Pourquoi gcc -mwindows fonctionne mais add_executable(Cmd WIN32 cmd.c) pas?

Peut-être que ce n'est pas l'équivalent de -mwindows dans cmake?

Répondre

2

Si vous souhaitez que votre programme s'exécute en mode console (c'est-à-dire une fonction main), vous devez le spécifier dans les propriétés de votre projet dans MSVC. Ce que vous utilisez en ce moment est un projet en mode fenêtré (ie une fonction WinMain, que vous n'avez pas, d'où l'erreur). Mais si vous ne voulez pas obtenir la fenêtre de console laide, vous voulez utiliser le mode fenêtré (c'est-à-dire transformer votre fonction main en une fonction propper WinMain). De cette façon, votre fenêtre normale est tout ce qui va montrer.

edit: En aparté, vous ne devriez vraiment pas nommer votre programme "cmd", c'est le nom de l'interpréteur de commandes de Windows.

+0

Mais je peux utiliser gcc pour construire un programme de fenêtre avec 'main', pourquoi pas' cmake'? BTW, pouvez-vous élaborer ce qu'est une fonction «WinMain» propper? J'ai essayé de changer 'main' en' WinMain' mais ne fonctionne toujours pas. – Gtker

+0

'int main (int, char **)' est la version console du point d'entrée. 'int WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)' est la version fenêtrée du point d'entrée. – Blindy

+0

À propos de votre première question, cmake fait exactement ce que vous lui dites de faire. Vous ne devriez pas demander "pourquoi ne peut pas cmake?", Vous devriez demander "pourquoi je ne peux pas dire à cmake de ...?". – Blindy

1

Selon le 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.

Cependant, le point d'entrée de votre programme est main() et non WinMain(). Ce que vous devriez faire, à la place, c'est omettre le drapeau WIN32, mais vous devez faire un lien avec libgtk. Donc, vous utiliseriez 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

Merci.J'ai essayé vos 2 solutions, mais aucun travail.Le premier génère encore une console, et le second rapports: 'cl: Alerte de ligne de commande D9002: ignorer l'option inconnue '-mwindows'' – Gtker

+0

@Michael Aaron Safyan, je J'ai collé le code ci-dessus, pouvez-vous jeter un oeil? – Gtker

+0

@Runner, désolé, mais je n'ai pas de copie de Windows sur laquelle tester ... Je connais CMake, mais pas tellement avec Windows. Peut-être que si vous pouviez me montrer la documentation pour le drapeau "-mwindows", je pourrais peut-être trouver l'équivalent CMake. –

4

ADD_EXECUTABLE (Cmd WIN32 cmd.c)

Indique CMake c'est un programme Windows, et il recherche WinMain au lieu de principal.Si vous voulez voir les drapeaux utilisés, vous pouvez lancer make VERBOSE = 1. La question pourrait être de savoir comment définir WinMain pour les applications gtk? Je sais avec Qt, vous liez dans une bibliothèque qui le définit pour vous.

+0

Je veux atteindre mon objectif par 'cmake' sans changer' main' en 'WinMain', comme' gcc -mwindows' l'a fait. – Gtker

2

Vous pouvez définir ces indicateurs de l'éditeur de liens pour avoir un point d'entrée main() et aucune console:

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

Pour plus d'informations, voir this answer pour les drapeaux de liaison et this answer pour savoir comment définir des indicateurs dans cmake.