Forum Programmation.c++ openBSD | g++ | efl

Posté par .
Tags : aucun
1
12
déc.
2009
Bonjour,

je voudrais commencer une petite interface graphique avec des efl. Je suis sous openBSD. J'ai installé le packet qu'il faut pour avoir les bibliothèques de bien installée. Après, j'ai cherché un tutorial pour débuter sans douleur. J'ai trouvé un bou de code sur le tutorial des efl qui doit me créer une fenêtre vide : une base simple pour vérifier que tout fonctionne.

Or j'ai un problème avec les options de compilation que je dois passer à g++ pour include les efl.

Voici mon main :

#include
#include "/usr/local/include/Ecore.h"
#include "/usr/local/include/Ecore_Evas.h"

using namespace std;

int
main (int argc, char *argv[])
{
Ecore_Evas *ee;
Evas *evas;

if (!ecore_init ())
return -1;

if (!ecore_evas_init ())
{
ecore_shutdown ();
return -1;
}
cout << " ** ecore_evas_software_x11_new"<

/*
Mettre son code ici
*/


cout << " ** ecore_evas_Fermeture" << endl;
ecore_evas_shutdown ();


return 1;
}


Voici ma commnde pour compiler :

g++ -L/usr/local/lib/etk -L/usr/local/lib/evas -l/usr/local/include -lEcore -lEcore_Evas main.cpp -include /usr/local/include/Evas.h -include /usr/local/include/Ecore_Evas.h


Et enfin voici l'erreur de compilation que j'obtiens

In file included from :6:
/usr/local/include/Ecore_Evas.h:42:18: Evas.h: No such file or directory


Pour plus d'explication voici ce qu'il se passe :
Mes bibliothèque standard (les .h) se trouvent dans le répertoire /usr/include. Or les autres bibliothèques tel que Mysql ou efl se trouvent dans le répertoire /usr/local/include.
Pour ce qui est des .so c'est le même problème. Les bibliothèques standard se trouvent /usr/lib et les autres bibliothèques dans le répertoire /usr/local/lib.

Je n'arrive pas à inclure correctement les efl pour g++.
Auriez vous une idée ?
  • # i majuscule

    Posté par . Évalué à 2.

    g++ (..) -I /usr/local/include/

    Le -I étant un i majuscule, ça fonctionne pas ?
    • [^] # Re: i majuscule

      Posté par . Évalué à 1.

      Nop,

      Ca ne fonctionne pas non plus ...

      J'obtiens ce genre de messages

      /usr/lib/libstdc++.so.47.0: warning: strcpy() is almost always misused, please use strlcpy()
      /usr/lib/libstdc++.so.47.0: warning: strcat() is almost always misused, please use strlcat()
      /tmp//cc5m9zuo.o(.text+0x19): In function `main':
      : undefined reference to `ecore_init'
      /tmp//cc5m9zuo.o(.text+0x2e): In function `main':
      : undefined reference to `ecore_evas_init'
      /tmp//cc5m9zuo.o(.text+0x37): In function `main':
      : undefined reference to `ecore_shutdown'
      /tmp//cc5m9zuo.o(.text+0x83): In function `main':
      : undefined reference to `ecore_evas_software_x11_new'
      /tmp//cc5m9zuo.o(.text+0xcc): In function `main':
      : undefined reference to `ecore_evas_show'
      /tmp//cc5m9zuo.o(.text+0x100): In function `main':
      : undefined reference to `ecore_evas_get'
      /tmp//cc5m9zuo.o(.text+0x131): In function `main':
      : undefined reference to `ecore_main_loop_begin'
      /tmp//cc5m9zuo.o(.text+0x15c): In function `main':
      : undefined reference to `ecore_evas_shutdown'
      collect2: ld returned 1 exit status
      • [^] # Re: i majuscule

        Posté par . Évalué à 0.

        Et avec

        g++ `pkg-config --libs --cflags evas ecore edje` main.cpp

        directement ?

        ( http://forum.enlightenment.org/comments.php?DiscussionID=120 )
      • [^] # Re: i majuscule

        Posté par (page perso) . Évalué à 4.

        En général, lorsque quelqu'un s'est donné la peine de faire avancer efficacement votre shmilblik et qu'en plus la suggestion a fonctionné, on dit merci plutôt que « nop ». Non ? Je suis par ailleurs assez étonné d'observer que les deux réponses (qui me paraissent parfaitement censée) à votre question ont été inexplicablement moinssée.

        Votre problème de compilation est résolu (le compilateur ne se plaint plus de ne pas pouvoir trouver de fichier). Reste à résoudre votre problème d'édition de liens. Je ne connais rien aux librairies que vous utilisez. Mais en faisant un
        grep ecore_init *
        sur les librairies graphiques vous devriez trouver facilement le nom de celle qui contient cette fonction manquante et vous pourrez ensuite l'inclure aisément avec un « -l ». Idem pour chacune des autres fonctions réclamées pas l'éditeur de lien.
        • [^] # Re: i majuscule

          Posté par . Évalué à 0.

          Je ne suis pas responsable des "moissement" des réponses.

          Pour ce qui est des remerciement, j'ai pour habitude de les exprimer dans mon dernier message quand j'ai totalement résolu mon problème.
          Et justement, je ne comprend toujours pas complètement ce qui se passe.

          Toutes les méthodes réclamées par le compilateur se trouvent dans le fichier Evas.h et Ecore_Evas.h.
          C'est ça qui est curieux, j'été persuadé qu'avec les bonnes options je réglerais mon problème or ce n'est pas le cas.
          Il y a donc plusieurs solutions, soit il me manque encore quelque chose dans les options soit les packets sont mal installé.

          Je penche plutôt pour la première hypothèse. C'est pourquoi je continu toujours de chercher tout en laissant un message ici disant que mon problème n'est toujours pas totalement résolu.
          • [^] # Re: i majuscule

            Posté par (page perso) . Évalué à 4.

            > Toutes les méthodes réclamées par le compilateur se trouvent dans
            > le fichier Evas.h et Ecore_Evas.h.

            Non. Les .h contiennent les déclarations. Le compilateur les a trouvées.

            > C'est ça qui est curieux, j'été persuadé qu'avec les bonnes options je réglerais
            > mon problème or ce n'est pas le cas.

            Le problème original est réglé. Le problème actuel est que tu ne comprends pas -l et -L.

            De rien.

            pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

          • [^] # Re: i majuscule

            Posté par (page perso) . Évalué à 7.

            Excusez l'éventuelle inadaptation de ma réponse. J'ai l'impression que vous avez encore un niveau grand débutant en programmation. Me tromperai-je ?
            D'après les quelques éléments de notre discussion il me semble que vous ne distinguez pas les choses suivantes : compilation et édition de lien d'une part et d'autre part fichiers d'en-tête et librairie. Plusieurs de vos déclarations me le laissent penser et donc ne voyez surtout pas d'insulte à ce que j'essaie de vous aider en vous tentant de vous permettre de mieux cerner ces notions. J'espère que cela vous sera utile.

            La transformation d'un code source en exécutable se déroule essentiellement en deux étapes : la compilation et l'édition de liens. La première commence par la vérification que votre programme est syntaxiquement correct (pas de points virgules manquant, d'appel de fonctions avec de mauvais arguments, ...). Pour cela le compilateur a besoin des définitions de toutes les fonctions et structures utilisées. Soit vous les avez écrites vous-mêmes (c'est la partie qu'on appelle « mon code ») soit vous les réutilisez depuis des fichiers d'en-tête (utilisant souvent la terminaison en .h). Pour indiquer au compilateur où trouver les fichiers en .h on utilise généralement l'option -I. Si votre programme est écrit correctement et que toutes les structures et fonctions sont correctement décrits alros le compilateur peut déjà finir la compilation et produire un « fichier objet » (souvent un fichier en .o) si vous utilisez l'option -c.

            En générale un fichier objet ne vous sera pas très utile (pour le moment) ce que vous voulez c'est une executable. Pour le réaliser, le compilateur invoque (discrétement) l'éditeur de liens (le programme qui vous a produit votre seconde série de messages d'erreurs une fois que vous avez corrigé votre option pour les includes). L'éditeur de liens va tenter de trouver le programme compilé de chacune des fonctions et méthodes employée dans votre programme pour produire un fichier exécutable. Ces choses se trouvent généralement dans :
            - des fichiers .o quand elles viennent de votre propre programme ;
            - des fichiers en .so ou .a appelés librairies (qu'il ne faut surtout pas confondre avec les fichiers d'en-tête) qui leurs sont associés. (Les librairies sont essentiellement des morceaux de code compilés avec l'option -c.)
            On indique que l'on souhaite utiliser une librairie avec l'option -lnom. Cela dit au compilateur que l'on souhaite utiliser la librairie appelée libnom.so ou libnom.a située dans un répertoire où se trouve normalement les librairies. L'option -L indique de chercher éventuellement des librairies dans le répertoire qui la suit.

            J'espère que tout ceci éclaire votre lanterne. Pour en revenir à votre dernière série d'erreurs, l'éditeur de lien se plaint qu'il lui manque un certain nombre de fonctions. Dans les fichiers Evas.h et Ecore_evas.h ne se trouvent probablement que les déclarations de ces fonctions. C'est suffisant pour le compilateur qui vérifie votre programme. Mais pour l'éditeur de liens, il faut aussi « le code » de la fonction. Celui-ci se trouve probablement dans l'une des librairies installées dans /usr/local/lib. C'est pour savoir dans laquelle de ces librairies que je vous ai indiqué de rechercher (avec la commande grep) les noms des fonctions manquantes dans les librairies de ce répertoire. Une fois que vous aurez trouvé la bonne librairie il devrait vous suffir d'ajouter une option avec -l... dans votre ligne de commande pour finalement obtenir votre executable.

            NB: veuillez m'excuser, c'est un peu long, il est tard et j'ai la flemme de me relire. J'espère que vous arriverez à retrouver vos petits avec ces quelques infos.
            • [^] # Re: i majuscule

              Posté par . Évalué à 1.

              Je sais comment se déroule une compilation, en revanche, je ne sais pas comment utiliser g++ avec des bibliothèques extérieur (je n'avais encore jamais essayé).
              Avec toutes ces explication, je devrais pouvoir m'en sortir ;)

              Merci beaucoup pour toutes ces explications !

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.