IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

environnement gtk propre et sans ambiguité


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 114
    Points : 53
    Points
    53
    Par défaut environnement gtk propre et sans ambiguité
    Bonjour,
    j'attaque le développement d'une appli sous raspbian, avec en autre du gtk,
    Je souhaite designer avec glade, puis coder en C++ pour ce qui est de la gestion des signaux et des attributs des différents widgets.

    Sur un premier test, j'ai été confronté à un pb du type utilisation de plusieurs version de gtk (2 et 3) ...
    Je laisse tomber ce test, et redémarre un projet (propre)

    Je veux repartir sur des bonnes bases, et donc:
    vérifier quelles sont toutes les versions de gtk actuelement installées sur ma machine
    ne garder que la dernière version stable de gtk+3 (donc peut être désinstaller une version 2)
    installer la dernière version stable de gtkmm

    Pouvez-vous m'y aider ?

    merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 114
    Points : 53
    Points
    53
    Par défaut
    je passe par le add_remove software
    je constate bin que j'ai une verion 2 et une version 3 d'installée.
    je tente un remove de la version 2
    mais cela entraine d'autres remove, dont codeblock qui est mon IDE, donc je ne peux pas effacer le gtk2

    je vais donc devoir faire cohabiter les 2?

    lorsque j'include un gtkmm, comment savoir si il utilise gtk+2 ou gtk+3?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 114
    Points : 53
    Points
    53
    Par défaut
    Et bien tout simplement en incluant gtkmm+3.0 dans les options de compilation et les linker settings
    enfin je crois

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 114
    Points : 53
    Points
    53
    Par défaut
    ok, merci

  5. #5
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Bonjour,

    GTK 2 et GTK 3 peuvent parfaitement cohabiter sur ta machine. Certaines applications anciennes qui ne se sont pas mis à jour utilisent GTK 2, d'autres plus récéntes ou plus actives utilisent GTK 3 (et GTK 4 est en préparation).
    En revanche, une application ne peut utiliser qu'une seule version de GTK: impossible d'utiliser un bout de l'un et un bout de l'autre. Pour choisir quelle version tu utilises, tu dois l'indiquer au compilateur. C'est la commande pkg-config qui te permet de gérer cela. Elle te donne les flags de compilation à utiliser pour une bibliothèque donnée et ses dépendances.

    Ainsi, si tu lances:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pkg-config --cflags gtk+-3.0
    pkg-config te renvoie les drapeaux (flags) de compilation à utiliser. Et dedans, l'option -I indique un chemin à inclure pour la recherche des fichiers d'en-tête (headers), qui pointe vers un sous dossier spécifique à la version de gtk que tu as demandé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -pthread -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng12
    Ainsi, un:
    incluera /usr/include/gtk-3.0/gtk/gtk.h

    Je te conseille la doc officielle à ce sujet: Compiling GTK+ Applications.

    Pour ce qui est de GTKmm, je ne l'ai jamais utilisé, donc je ne peux que te renvoyer vers le site officiel, gtkmm.org.
    Par curiosité, pour quelle raison tu as décidé de passer du C au C++ ? Tu maîtrises mieux le C++ ? Parce que sur ta question précédente tu n'avais pas l'air à l'aise avec le C, donc j'ai peur que cela ne soit pas forcément plus simple: tu as toujours le fonctionnement propre à GTK à apprendre, et la documentation de référence est pour l'API en C, qui sera forcément mieux documentée.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 114
    Points : 53
    Points
    53
    Par défaut
    Merci liberforce,

    voilà des explications très claires et un lien bien utile (j'ai souvent du mal à trouver ce type d'infos)

    pourquoi j'opte pour gtkmm?
    C'est une bonne question dont je ne suis pas encore sûr de la réponse.

    l'interface tactile que je veux développer doit s'insérer dans un projet existant, que j'ai développé en C++, et il me semblait judicieux de ne pas mélanger plusieurs langages.
    Mais le C++ englobant le C, peut-être n'est ce pas un problème technique.

    Mais n'est-ce pas un problème pour moi?
    EN effet, je ne maitrise aucun langage, jusqu'à présent j'avais fait de lASM et C très bas niveau, et les .h utilisés se résumaient au mapping GPIO et registres des microcontrôleurs ciblés.
    Sur ce projet, je bosse sur platefrome avec OS et utilise des bibliothèques de plus haut niveau (opencv, mount, fstream, libudev, gtk, ....)

    J'ai profité de cette occasion pour glisser vec le C++, en particulier pour l'aspect "objet", d'autant que nombre de ressources sont aussi en C++, mais pas que ... et tu soulignes bien que
    la documentation de référence est pour l'API en C, qui sera forcément mieux documentée.
    ce qui est important aussi.

    ALors dois-je rester en C pour cette partie du soft, ou continuer à bosser plutôt le C++ qui m'ouvre des perspectives plus intéressantes?

    voilà ce que je lis sur un cours de ce site:
    Le C n'est certes pas un langage fait prévu pour la POO mais en poussant à l'extrême la notion de type abstrait de donnée (TAD), GTK+ offre des possibilités proche de la POO.
    ALors j'ai l'impression que ça va être plus douloureux (pousser à l'extrême) en C si je veux être proche de POO


    Je réfléchi en même temps que j'écris ...............

    alors finalement, mélange C et C++ ou pas, that's the question?
    Dans tous les cas, il me semble plus judicieux de laisser tomber glade, car il ne s'agit pas non plus d'une interface avec 100 widgets, et ça ne m'aidera pas forcément à travailler mon C, ou C++.

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    alors finalement, mélange C et C++ ou pas, that's the question?
    Si tu veux effectivement progresser au niveau programmation objet, c'est sûr, le C++ est un meilleur choix: les notions d'héritage sont dans le langage, contrairement au C. GTK utilise la bibliothèque GObject pour contourner ces limitations, mais ça reste un peu hardu.
    Donc de ce point de vue là, le C++ est un choix valide. Dans ce cas si tu choisis le C++, autant y aller à fond et opter pour GTKmm.

    Dans tous les cas, il me semble plus judicieux de laisser tomber glade, car il ne s'agit pas non plus d'une interface avec 100 widgets, et ça ne m'aidera pas forcément à travailler mon C, ou C++.
    Oui mais ça te donne une interface plus souple aussi, où tu n'as pas besoin de code pour changer un widget de place. C'est aussi plus proche de ce qu'on ferait pour une vraie application en production: on ne code pas toute l'interface, parce que ce n'est pas souple. L'utilisation de Glade apporte aussi son lot de challenges, ne t'en fais pas, et avec le C++ et GTKmm je pense que tu n'auras pas le temps de t'ennuyer, ce sont déjà 2 gros morceaux . Le plus important, ce n'est pas l'interface graphique, mais la logique qui est derrière, et le temps que tu pourras gagner d'un côté te permettra de te concentrer là dessus.

    Bon courage
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 114
    Points : 53
    Points
    53
    Par défaut et pourtant
    J'ai donc inclut dans mon projet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    `pkg-config gtkmm-3.0 --cflags`
    `pkg-config gtkmm-3.0 --libs`
    dans mes option de compil et linkage

    mon projet démarre par copier-coller du site developer.gnome
    https://developer.gnome.org/gtkmm-tu...idgets.html.en

    et donc ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #include "define.h"
    #include "pict.h"
    #include <gtkmm/main.h>
    #include <gtkmm/window.h>
    #include <gtkmm/button.h>
    #include <gtkmm/textview.h>
    #include <gtkmm/builder.h>
     
    //Gtk::Dialog* pDialog = nullptr;
    Gtk::Window* pDialog = nullptr;
     
    static
    void on_button_clicked()
    {
      if(pDialog)
        pDialog->hide(); //hide() will cause main::run() to end.
    }
     
    int main (int argc, char **argv)
    {
      auto app = Gtk::Application::create(argc, argv, "glade2");
     
      //Load the GtkBuilder file and instantiate its widgets:
      auto refBuilder = Gtk::Builder::create();
    //  try
    //  {
        refBuilder->add_from_file("basic.glade");
    //  }
    /*  catch(const Glib::FileError& ex)
      {
        std::cerr << "FileError: " << ex.what() << std::endl;
        return 1;
      }
      catch(const Glib::MarkupError& ex)
      {
        std::cerr << "MarkupError: " << ex.what() << std::endl;
        return 1;
      }
      catch(const Gtk::BuilderError& ex)
      {
        std::cerr << "BuilderError: " << ex.what() << std::endl;
        return 1;
      }
    */
      //Get the GtkBuilder-instantiated Dialog:
      refBuilder->get_widget("DialogBasic", pDialog);
      if(pDialog)
      {
        //Get the GtkBuilder-instantiated Button, and connect a signal handler:
        Gtk::Button* pButton = nullptr;
        refBuilder->get_widget("quit_button", pButton);
        if(pButton)
        {
          pButton->signal_clicked().connect( sigc::ptr_fun(on_button_clicked) );
        }
     
        app->run(*pDialog);
      }
     
      delete pDialog;
     
      return 0;
    }
    première surprise: type Dialog inconnu, alors j'ai plutôt fait une fenêtre, ça passe
    puis pb avec try/catch: pour l'instant en commentaire,
    pour en arriver au problème du post à l'exécution de l'appli depuis terminal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sudo ./dic_2_05
     
    (process:1834): GLib-GIO-CRITICAL **: g_application_set_application_id: assertion 'application_id == NULL || g_application_id_is_valid (application_id)' failed
     
    (dic_2_05:1834): Gtk-ERROR **: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported
    voici la ligne générée par codeblock pour compiler (il ya aussi d'autres lib dont opencv, ça rend pas la lecture facile)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++  -o bin/Debug/dic_2_05 obj/Debug/pict.o obj/Debug/classe.o obj/Debug/file.o obj/Debug/hard.o obj/Debug/initHard.o obj/Debug/main.o obj/Debug/timer.o obj/Debug/usbDevice.o  -lgtkmm-3.0 -latkmm-1.6 -lgdkmm-3.0 -lgiomm-2.4 -lpangomm-1.4 -lglibmm-2.4 -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lgio-2.0 -lcairomm-1.0 -lcairo -lsigc-2.0 -lgdk_pixbuf-2.0 -lgobject-2.0 -lglib-2.0  -I/usr/include/opencv  /usr/lib/arm-linux-gnueabihf/libopencv_calib3d.so -lopencv_calib3d /usr/lib/arm-linux-gnueabihf/libopencv_contrib.so -lopencv_contrib /usr/lib/arm-linux-gnueabihf/libopencv_core.so -lopencv_core /usr/lib/arm-linux-gnueabihf/libopencv_features2d.so -lopencv_features2d /usr/lib/arm-linux-gnueabihf/libopencv_flann.so -lopencv_flann /usr/lib/arm-linux-gnueabihf/libopencv_gpu.so -lopencv_gpu /usr/lib/arm-linux-gnueabihf/libopencv_highgui.so -lopencv_highgui /usr/lib/arm-linux-gnueabihf/libopencv_imgproc.so -lopencv_imgproc /usr/lib/arm-linux-gnueabihf/libopencv_legacy.so -lopencv_legacy /usr/lib/arm-linux-gnueabihf/libopencv_ml.so -lopencv_ml /usr/lib/arm-linux-gnueabihf/libopencv_objdetect.so -lopencv_objdetect /usr/lib/arm-linux-gnueabihf/libopencv_ocl.so -lopencv_ocl /usr/lib/arm-linux-gnueabihf/libopencv_photo.so -lopencv_photo /usr/lib/arm-linux-gnueabihf/libopencv_stitching.so -lopencv_stitching /usr/lib/arm-linux-gnueabihf/libopencv_superres.so -lopencv_superres /usr/lib/arm-linux-gnueabihf/libopencv_ts.so -lopencv_ts /usr/lib/arm-linux-gnueabihf/libopencv_video.so -lopencv_video /usr/lib/arm-linux-gnueabihf/libopencv_videostab.so -lopencv_videostab  -pthread  -lwiringPi -lmount -ludev
    donc voici, semble-t-il un conflit entre gtk2 et 3

    en effet, il semblerait que create(...) soit une méthode de gtk2,

    mais quand même j'ai du mal à croire que cet exemple, vu sa source et visibilité, soit erroné de la sorte, surtout en plus avec les deux erreurs précédentes.

    DOnc soit un truc grossier (ou subtile d'ailleurs) qui m'échappe,
    Soit un code à revoir .... et je n'ai pas trouvé comment remplacer les méthodes create (add_from_new_file, mais tj des erreurs, je dois mal m'y prendre

    Pouvez-vous me dire si ce code vous parait fonctionnel ?

    Merci

  9. #9
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Hum, je ne fois pas de flags spécifiques à GTK 2 dans la commande de build que tu as donnée, donc je pense que cela doit être une de tes bibliothèques opencv qui dépend peut être de GTK 2. Enlève la dépendance à opencv pour ne plus avoir ses flags de compilations pour commencer, ça devrait marcher je pense. Si c'est le cas, c'est peut être la bibliothèque opencv_legacy qui te tire la dépendance à GTK 2. Si tu es sous Linux. Tu peux lancer la commande ldd avec comme argument une bibliothèque (fichier .so) pour voir ses dépendances et voir si une des bibliothèques opencv dépend de GTK 2.

    Aussi, tu n'as pas besoin je pense de lancer ton programme avec les droits sudo (à moins que tu n'aies besoin d'accéder à du matériel spécifique genre webcam à traiter avec opencv ?).
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 114
    Points : 53
    Points
    53
    Par défaut
    effectivement, le projet apprècie que je retire la lib opencv des linker setting, et se lance sans conflit gtk2/gtk3

    et effectivement des dépendances opencv utilisent gtk2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ldd /usr/lib/arm-linux-gnueabihf/libopencv_features2d.so
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    libgtk-x11-2.0.so.0 => /usr/lib/arm-linux-gnueabihf/libgtk-x11-2.0.so.0 (0x75d4e000)
    	libgdk-x11-2.0.so.0 => /usr/lib/arm-linux-gnueabihf/libgdk-x11-2.0.so.0 (0x75caa000)
    et d'autres ....

    donc j'imagine qu'il n'y a que 2 choses à envisager ....
    obliger opencv à bosser avec gtk3
    développer mon interface graphique sous gtk2 et donc désinstaller gtk 3 de ma machine

    sachant que je démarre juste mon interface graphique alors que tout le côté opencv est validé (acquisition webcam et traitement d'image)

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 114
    Points : 53
    Points
    53
    Par défaut
    du coup je cherche si je trouve des sources qui correspondrai à gtkmm2.x avec glade3 et gtk builder .....

    J'avoue nécessiter un bon petit exemple complet pour bien démarrer, je ne troive pas mon bonhue popur l'instant.

    SI j'arrive à démarrer, et isoler des infos propre à cette logique, je partirai bien sur uniquement du gtk2 sur tout mon projet.

    Des liens à m'indiquer ?

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/06/2014, 18h38
  2. Réponses: 2
    Dernier message: 11/01/2007, 15h56
  3. execution sur ordi sans GTK
    Par gy0m76 dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 01/01/2007, 11h25
  4. Réponses: 11
    Dernier message: 07/09/2006, 09h10
  5. Réponses: 2
    Dernier message: 29/08/2005, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo