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

 C++ Discussion :

installation jsoncpp sur Ubuntu


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 24
    Points
    24
    Par défaut installation jsoncpp sur Ubuntu
    Bonjour

    Je vient d'installer la librairie jsoncpp sur Ubuntu.
    L'installation semble s'être déroulée sans aucun problème (aucun message d'erreur).
    Maintenant, j'essaie d'inclure cette librairie dans mon code C++:

    #include <json/json.h>

    et j'obtiens le message d'erreur suivant:

    fatal error: json/json.h: Aucun fichier ou dossier de ce type

    Comment puis-je corriger ce problème ?

    Merci

    JF

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    Je viens de faire un make install et je peux maintenant compiler le code suivant:

    #include "json/json.h"
    int main()
    {
    return 0;
    }
    mais si j'essaie de déclarer un objet Json:
    Json::Value root;
    j'obtiens lors de la compilation:
    référence indéfinie vers « Json::Value::Value(Json::ValueType)
    Je comprend que je dois indiquer le lien vers la librairie.
    Comment puis-je trouver l'endroit où se trouve cette librairie?

    avec la commande: find / -name json, je trouve

    /home/jfjobidon/Bureau/bitcoin/src/json
    /home/jfjobidon/Bureau/QcCoin/src/json
    /home/jfjobidon/Bureau/jsoncpp-master/include/json
    /var/lib/php5/modules/cli/enabled_by_maint/json
    /var/lib/php5/modules/registry/json
    /var/lib/php5/modules/apache2/enabled_by_maint/json
    /usr/local/src/bitcoin-0.9.3/src/json
    /usr/local/include/json
    /usr/include/php5/ext/json
    /usr/lib/python2.7/json
    /usr/lib/php5/json
    /usr/lib/python3.4/json

    Je constate que Json est installé à plusieurs endroits.
    Comment puis-je trouvé le lien que je dois fournir au compilateur ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 27
    Points : 24
    Points
    24
    Par défaut
    J'ai réussi à compiler la librairie json avec scons.
    Je peux maintenant compiler mon programme avec le lien suivant:
    >g++ test2.cpp -std=c++11 -usr/lib/libjson_linux-gcc-4.8_libmt
    Donc en principe, si le code compile, je devrait avoir accès à libjson,
    Mais si j'enlève le commentaire sur
    Json::Value root;
    j'ai encore le même message d'erreur
    référence indéfinie vers « Json::Value::Value(Json::ValueType) »
    Dans mon code j'ai placé:
    #include "json/json.h"
    #include <json/value.h>

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 617
    Points : 30 636
    Points
    30 636
    Par défaut
    Salut,

    Allez, tu y es presque...

    Ce qu'il faut savoir, c'est qu'il y a deux grandes étapes dans le processus de compilation d'une application (en réalité, il y en a plus que ca, mais deux seulement nous intéressent pour ma réponse )
    • La compilation proprement dite et
    • l'édition de lien

    La compilation va avoir pour objectif (je vais essayer de faire simple ) de générer du code binaire (comprends : exécutable par le processeur) à partir de chacun de tes fichiers sources (*.cpp). On parle souvent de fichiers objets pour désigner le résultat de cette étape et, sous linux, l'extension de tels fichiers est *.o.

    L'édition de liens va avoir pour but de regrouper tous les fichiers objets générés pendant la compilation afin de créer l'exécutable final. Mais, dans certaines circonstances, il "manque" certaines parties de code binaire, ce qui occasionne une erreur de la part du compilateur prenant la forme de référence indéfinie vers <nom d'une fonction>.

    Tu comprends maintenant l'origine de l'erreur que tu obtiens : l'éditeur de liens ne trouve pas, dans tous les fichiers objets qu'il parcoure, le symbole correspondant au constructeur de la classe Value se trouvant dans l'espace de noms Json. Et c'est tout ce qu'il y a de plus normal, car le code binaire correspondant à cette fonction (après tout, un constructeur n'est qu'une fonction patrituclière ) ne se trouve dans aucun des fichiers objets que le processus de compilation de ton projet a pu générer, mais... dans la bibliothèque json.

    Pour faire savoir à l'éditeur de liens qu'il doit aller voir dans une bibliothèque "inhabituelle" (comprends : que l'on n'utilise pas forcément dans n'importe quel projet) après le code binaire des fonctions "manquantes", il faut lui indiquer explicitement dans quelle bibliothèque il doit aller chercher. Cela se fait à l'aide de l'option <codeinline>-lnomDeLaBibliothèque</codeinline>(Attention, c'est un L minuscule et non un i majuscule ) ou nomDeLaBibliothèque correspond au nom du fichier lib*.a que tu trouveras généralement dans /user/lib (ou dans d'autres dossiers lib, en fonction de la manière dont tu as installé la bibliothèque) sans le "lib" et sans le ".a".

    Ainsi, je présume que la biliothèque json s'appelle sans doute libjson.a ou, qui sait, peut être libjson_x_y_z.a. Le nom que tu dois utiliser sera donc json (dans le premier cas) ou json_x_y_z (ou x correspond traditionnellement au numéro de version principal, y au numero de sous version et z au numero de bugfix).

    Mais cela ne fonctionnera que si tu as installé ta bibliothèque dans un dossier dans lequel l'éditeur de liens a l'habitude d'aller chercher les bibliothèques!!! (typiquement : /lib et/usr/lib, pour les deux principaux, peut être, mais à vérifier, dans /usr/local/lib). Si ce n'est pas le cas (hé oui, il faut les droits root pour pouvoir installer des fichiers dans /usr/lib ), il faudra en plus que tu ajoute l'option <codeinline>-Ldossier/contenant/le/fichier/lib</codeinline> (ou dossier dossier/contenant/le/fichier/lib correspond au chemin d'accès au dossier contenant le fameux libjson.a) pour que l'éditeur de liens puisse savoir qu'il doit aller chercher les bibliothèques "inhabituelles" dans le dossier en question.

    L'idéal au final est donc de travailler toi aussi en deux étapes :
    La première étant de générer le fichier objet à l'aide de la commande <codeinline>g++ -c main.cpp -o main.o</codeinline> et la seconde de provoquer l'édition de liens à l'aide de la commande <codeinline> g++ main.o -ljson nomDeTonApplication</codeinline>

    Ceci dit cette méthode deviendra rapidement très lourde à mettre en oeuvre quand ton projet commencera à utiliser plusieurs fichiers sources.

    L'idéal est "d'automatiser" la compilation à l'aide de Makefile, des fichiers indiquant à l'outil make (tiens donc ) les différentes étapes à suivre pour obtenir un exécutable fonctionnel à partir des fichiers sources. Mais l'écriture d'un fichier Makefile n'est pas vraiment une cinécure pour les projets les plus complexes (surtout si, en plus, ces projets doivent être portables et compilés sur différentes machines). L'idéal est alors d'utiliser des outils comme les "autotools" (aclocal, autoconf, autoheader, (libtool) et automake) ou comme cmake pour générer le Makefile.

    Mais ces outils (autotools et cmake) sont assez difficile à manier au début (bien que le fait d'être capable de les utiliser représente un plus très intéressant). Tu peux, peut être, aussi te tourner vers l'utilisation d'un EDI (Environnement de Développement Intégré): un outil -- le plus souvent "graphique" qui a le bon gout de fournir un éditeur de texte avec la coloration syntaxique et l'auto-complétion et de prendre en charge l'ensemble des étapes nécessaires à la compilation.

    Cependant, chaque EDI a ses propres habitudes, et il est donc difficile de dire de manière générale "comment" le configurer pour utiliser une bibliothèque tierce. Tout ce que je peux donc dire (de manière tout à fait générale), c'est qu'il faudra également indiquer à ton EDI que l'éditeur de liens devra utiliser la bibliothèque json lorsqu'il recherchera les symboles binaires correspondant au fonctions exposées par cette bibliothèque
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. installer MySQL sur Ubuntu
    Par Jasmine80 dans le forum Ubuntu
    Réponses: 2
    Dernier message: 18/07/2008, 16h49
  2. Problème pour installer Munin sur Ubuntu Server 8.04
    Par Otaugames dans le forum Administration système
    Réponses: 1
    Dernier message: 18/06/2008, 09h24
  3. Problème pour installer aMSN sur ubuntu
    Par amine_en_france dans le forum Ubuntu
    Réponses: 2
    Dernier message: 10/09/2007, 19h31
  4. Installation KDE sur Ubuntu
    Par vedder dans le forum KDE
    Réponses: 4
    Dernier message: 17/03/2007, 14h20
  5. probleme installation ati sur ubuntu
    Par nemo69500 dans le forum Matériel
    Réponses: 2
    Dernier message: 12/02/2007, 15h36

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