9
votes

Quel est l'équivalent de l'option -Mwindows de GCC dans CMAKE?

Je suive le tuto:

http://zetcode.com/tatudials/gtktutorial / FirstPrograms / P>

Cela fonctionne, mais chaque fois que je double clique sur l'exécutable, il y a une console que je ne le veux pas là-bas. P>

Comment puis-je obtenir débarrassé de cette console? p>

J'ai essayé ceci: p> xxx pré>

mais obtient cette erreur fatale: p> xxx pré> Bien que l'utilisation de GCC fonctionne directement: P>

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


0 commentaires

5 Réponses :


2
votes

Si vous souhaitez que votre programme soit exécuté en mode Console (c.-à-d. une fonction principale ), vous devez la 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é (c'est-à-dire une fonction WinMain , que vous n'avez pas, d'où l'erreur).

Mais si vous ne voulez pas obtenir la fenêtre laid de la console, vous souhaitez utiliser le mode fenêtré (c.-à-d. Transformer votre fonction principale dans une fonction WinMain Fonction) . De cette façon, votre fenêtre normale est tout ce qui va montrer.

EDIT: En terminer, vous ne devez vraiment pas nommer votre programme "cmd", c'est le nom de l'interpréteur de commande de Windows '


3 commentaires

Mais je peux utiliser GCC pour créer un programme de fenêtre avec principal , pourquoi ne peut pas cmake ? BTW, pouvez-vous élaborer ce qui est un properbeur WinMain fonctionner? J'ai essayé de changer principal sur winmain mais ne fonctionne toujours pas.


Int Main (int, Char **) est la version de la console du point d'entrée. int winapi winmain (hinstance, hinstance, lpstr, int) est la version vitrée du point d'entrée.


À propos de votre première question, Cmake fait exactement ce que vous le dites. Vous ne devriez pas demander "pourquoi ne peut pas cmake?", Vous devriez demander "Pourquoi ne puis-je pas dire à Clake de ...?".



1
votes

Selon le Documentation CLAKE pour l'utilisation Le drapeau Win32 avec add_executable :

Lorsque cette propriété est définie sur True, l'exécutable lorsque la liaison sur Windows sera créée avec un point d'entrée WinMain () au lieu de juste principal (). Cela en fait un gui exécutable au lieu d'une application de console. Voir la documentation de variable CUKE_MFC_FLAG pour configurer l'utilisation de MFC pour les exécutables WinMain.

Cependant, le point d'entrée de votre programme est Main () et non WinMain () . Ce que vous devriez faire, plutôt, omettez le drapeau Win32, mais vous devez relier contre libgtk. Donc, vous utiliseriez cible_link_libraries: xxx


4 commentaires

Thank.J'ai essayé vos 2 solutions, mais aucun travail. Le premier génère toujours une console et le second rapporte: cl: ligne de commande avertissement D9002: ignorer l'option inconnue '-MWindows'


@Michael Aaron Safyan, j'ai collé le code ci-dessus, pouvez-vous jeter un coup d'oeil?


@Runner, désolé, mais je n'ai pas de copie de Windows sur laquelle vérifier ... Je suis familier avec Cmake, mais pas tellement avec Windows. Peut-être que si vous pouviez me montrer la documentation pour le drapeau "-Mwindows", je pourrais peut-être comprendre l'équivalent de la cmake.


Je ne connais pas ce drapeau aussi, mais quelqu'un donne ce lien: msdn.microsoft.com/en-us/library/fcc1zstk%28vs.71%29.aspx



5
votes

add_executable (cmd win32 cmd.c)

Indique CMAKE Ceci est un programme Windows, et il cherche WinMain au lieu de la principale. Si vous voulez voir les drapeaux utilisés, vous pouvez exécuter faire Verbose = 1. La question pourrait être comment définissez-vous WinMain pour les applications GTK? Je sais avec qt, vous liez dans une bibliothèque qui le définit pour vous.


2 commentaires

Je veux atteindre mon objectif par cmake sans changer principal sur winmain , comme gcc -mwindows .


CMAKE .. -DCMAKE_CXX_FLAGS = "- mwindows" pour C ++



3
votes

Vous pouvez définir ces drapeaux de liaison pour avoir un point d'entrée MAIN () CODE> et aucune console:

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


1 commentaires

Cette méthode de spécification du point d'entrée (ne peut rien dire sur le sous-système) ne fonctionnait pas pour moi, mais cible_link_options Un suggéré dans Stackoverflow.com/a/58079971/132042 a fait. Lorsque j'ai examiné les drapeaux comme étant transmis dans la liaison, / entrée n'était pas là.



2
votes

Pour CMAKE 3.13 et plus récent Vous pouvez utiliser

target_link_options(target PRIVATE "/SUBSYSTEM:WINDOWS" "/ENTRY:mainCRTStartup")


0 commentaires