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 :

Ajout et utilisation librairie(exemple simple)


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Points : 30
    Points
    30
    Par défaut Ajout et utilisation librairie(exemple simple)
    Bonjour,

    suite à mon précédent message, j'ai cherché dans de multiples cours sur internet pour savoir comment ajouter et utiliser une librairie en C++. Et je n'ai pas trouvé. Par exemple, dans ce cours :

    http://sites.univ-provence.fr/cpp/V1/lecons.htm

    En particulier, j'ai vraiment besoin d'avoir un modèle (idéalement avec l'exemple du pgcd : je précise à nouveau, que je ne souhaite pas reprogrammer l'algo. pour trouver le pgcd mais mais utiliser une librairie existante afin de savoir comme ajouter et utiliser et librairie)

    Merci pour toute aide concrète.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Généralement, c'est plutôt le distributeur de la librairie en question qui explique comment installer sa lib à lui. Exemple avec Boost, le couteau-suisse du C++ qui fournit pas mal de fonctions mathématiques :

    1) Télécharge et extrait Boost dans c:\boost

    2) Ajout le chemin « c:\boost» à ton projet
    Comment le faire dépendra de ton environnement de développement : Visual C++, Code::Blocks, Makefile ?

    3) En te basant sur la doc, écrit un code de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <iostream>
    #include <boost/math/common_factor.hpp>
    int main() {
      std::cout << boost::math::gcd(24, 42) << std::endl;
      return 0;
    }
    Et c'est tout.

    Comme souvent dans Boost il n'y a pas besoin de DLL "tierce", tout est compris dans les headers. Donc pas besoin d'informer ton linker sur des .LIB/.DLL supplémentaires (étape qui, là encore, dépend de ton EDD).

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Points : 30
    Points
    30
    Par défaut
    Je travaille sous linux. Dois-je alors adapter certaines choses en conséquence ?

    Je travaille simplement avec gedit sous linux

    Pour préciser ma question, vous disiez dans votre message :

    1) Télécharge et extrait Boost dans c:\boost

    2) Ajout le chemin « c:\boost» à ton projet
    Comment le faire dépendra de ton environnement de développement : Visual C++, Code::Blocks, Makefile ?
    , et n'étant pas un expert de linux, je souhaitais savoir si je devais ajouter quelque chose de particulier, étant donné que je travaille sous linux, ou bien y'a-t-il une manipulation particulière à faire ?

    Merci d'avance.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Points : 30
    Points
    30
    Par défaut
    Pour comprendre comment utiliser la doc, Je tente d'utiliser la doc, et d' exécuter le programme qui y est proposé, c'est le suivant :

    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
    #include <boost/math/common_factor.hpp>
    #include <algorithm>
    #include <iterator>
     
     
    int main()
    {
       using std::cout;
       using std::endl;
     
       cout << "The GCD and LCM of 6 and 15 are "
       << boost::math::gcd(6, 15) << " and "
       << boost::math::lcm(6, 15) << ", respectively."
       << endl;
     
       cout << "The GCD and LCM of 8 and 9 are "
       << boost::math::static_gcd<8, 9>::value
       << " and "
       << boost::math::static_lcm<8, 9>::value
       << ", respectively." << endl;
     
       int  a[] = { 4, 5, 6 }, b[] = { 7, 8, 9 }, c[3];
       std::transform( a, a + 3, b, c, boost::math::gcd_evaluator<int>() );
       std::copy( c, c + 3, std::ostream_iterator<int>(cout, " ") );
    }
    mais à la compilation,j'ai le message d'erreur :

    error: ‘boost’ has not been declared


    Je travaille avec gedit , donc à priori , je ne sais comment ajouter le lien de boost à mon petit projet.

    merci de votre aide.

  5. #5
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    tu dois ajouter le chemin de boost dans ton makefile

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INCLUDEPATH += /usr/local/boost/
    ou un truc du genre.
    Tu es sous Linux, tu as donc installé boost avec sudo apt-get install boost-dev ou quelque chose comme ça ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Points : 30
    Points
    30
    Par défaut
    Bonjour,

    en fait, je n'ai pas de Makefile.

    Pour tout vous dire(je ne sais pas s'il faut que je change ma façon de faire), j'ai recopié le fichier d'example que j'ai suffixé avec .cpp

    Ce fichier est sur le Bureau.

    Puis , comme suggéré dans le "fil", j'ai téléchargé "boost" sur le Bureau, je l'ai extrait sur le "Bureau".

    Et c'est alors que j'ai ouvert un terminal et j'écris : g++ nomdufichier.cpp et c'est alors que j'ai le message d'erreur que je viens de vous rappeler : "boost has not been declared"

    Que dois-je faire ?

    merci

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Lis la doc Boost pour savoir comment compiler/tester un exemple :
    http://www.boost.org/doc/libs/1_52_0...-variants.html

    Et essaie plutôt d'installer Boost via ton gestionnaire de paquets, comme ce n'est pas dit très explicitement dans la doc.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Points : 30
    Points
    30
    Par défaut
    Lorsque je compile le fichier d'exemple, et que j' éxécute le fichier ./a.out, j'obtiens ceci :

    The GCD and LCM of 6 and 15 are 3 and 30, respectively.
    The GCD and LCM of 8 and 9 are 1 and 72, respectively.
    1 1 3

    Et ce que je ne comprends pas , ce sont les 2 dernières lignes du code justement, celles qui permettent d'obtenir :
    1 1 3
    Auriez-vous la gentillesse de m'expliquer ce que veulent dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::transform( a, a + 3, b, c, boost::math::gcd_evaluator<int>() );
    std::copy( c, c + 3, std::ostream_iterator<int>(cout, " ") );

    A quoi servent std::transform, math::gcd_evaluatoir, std:copy,std::ostream_iterator<int> ?

    Je vous en remercie d'avance.

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Ce sont des algorithmes de la STL, qui travaillent sur des conteneurs (ex: std::vector). Réfère-toi à la doc :
    http://en.cppreference.com/w/cpp/algorithm/transform
    http://en.cppreference.com/w/cpp/algorithm/copy

    math::gcd_evaluator est un objet-fonction (ou foncteur) qui contient le traitement GCD. C'est comme une fonction, sauf qu'on peut la passer en argument en tant qu'objet.

    std::ostream_iterator<int> est un objet de la STL qui permet de convertir un flux sortant en itérateur. Là encore, cf doc :
    http://en.cppreference.com/w/cpp/ite...tream_iterator

    L'équivalent avec du code plus classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for (int i=0; i<3; i++)
    {
      c[i] = gcd_evaluator(a[i], b[i]);
    }
     
    for (int i=0; i<3; i++)
    {
      cout << c[i] << " ";
    }

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Points : 30
    Points
    30
    Par défaut questions supplémentaires
    Bonjour,

    1) à quoi sert précisément le -I dans :

    c++ -I path/to/boost_1_52_0 example.cpp -o example

    j'ai trouvé ceci dans la doc de boost.


    2)Je ne comprends pas la différence entre

    boost::math::gcd(6, 15) et
    boost::math::static_gcd<8, 9>::value



    dans l'exemple de code la doc de boost qui est le suivant :

    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
    #include <boost/math/common_factor.hpp>
    #include <algorithm>
    #include <iterator>
    #include <iostream>
     
    int main()
    {
       using std::cout;
       using std::endl;
     
       cout << "The GCD and LCM of 6 and 15 are "
       << boost::math::gcd(6, 15) << " and "
       << boost::math::lcm(6, 15) << ", respectively."
       << endl;
     
       cout << "The GCD and LCM of 8 and 9 are "
       << boost::math::static_gcd<8, 9>::value
       << " and "
       << boost::math::static_lcm<8, 9>::value
       << ", respectively." << endl;
     
       int  a[] = { 4, 5, 6 }, b[] = { 7, 8, 9 }, c[3];
       std::transform( a, a + 3, b, c, boost::math::gcd_evaluator<int>() );
       std::copy( c, c + 3, std::ostream_iterator<int>(cout, " ") );
    }

    Pourriez-vous m'expliquer ? car je ne connais pas trop bien cette histoire de _static que l'on vient ajouter devant.

    Merci bien
    Amicalement

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    le -I c'est pour déclarer les include_path

    gcd et static_gcd sont juste 2 fonctions qui n'ont pas le même nom. Pour connaître leur différence, il faudrait voir la doc qui en parle surement.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Tu as spécifié #include <boost/math/common_factor.hpp> dans ton code, pourtant il n'existe pas de répertoire « boost » dans le répertoire où tu as lancé ta commande g++. -I permet d'aider ton compilo à localiser ce répertoire supplémentaire sur ton disque. Généralement -I/usr/include/boost ou -I/usr/local/include/boost sous Linux.

    static_gcd est un calcul qui a lieu à la compilation, si tes arguments sont eux aussi connus dès la compilation. C'est pour faire de la métaprogrammation template, donc rien qui te concerne.

  14. #14
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 211
    Points
    23 211
    Par défaut
    Bonjour,

    Citation Envoyé par cob59 Voir le message
    Tu as spécifié #include <boost/math/common_factor.hpp> dans ton code, pourtant il n'existe pas de répertoire « boost » dans le répertoire où tu as lancé ta commande g++. -I permet d'aider ton compilo à localiser ce répertoire supplémentaire sur ton disque. Généralement -I/usr/include/boost ou -I/usr/local/include/boost sous Linux.
    Ce n'est qu'un avis personnel mais je pense qu'il faudrait bannir les options -I quand les bibliothèques ne sont pas dans une sous-répertoire du projet :
    Il y a rien de pire pour rendre le projet non-portable d'un ordinateur à l'autre.

    Pourquoi ne pas directement utiliser les options du type -lboost_system, -lboost_thread ?
    Ainsi toute personne voulant compiler ton code doit simplement installer correctement les bibliothèques sans à avoir à modifier le makefile.

  15. #15
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Bonjour,


    Ce n'est qu'un avis personnel mais je pense qu'il faudrait bannir les options -I quand les bibliothèques ne sont pas dans une sous-répertoire du projet :
    Il y a rien de pire pour rendre le projet non-portable d'un ordinateur à l'autre.

    Pourquoi ne pas directement utiliser les options du type -lboost_system, -lboost_thread ?
    Ainsi toute personne voulant compiler ton code doit simplement installer correctement les bibliothèques sans à avoir à modifier le makefile.
    C’est assez vrai, mais la bonne solution c’est plutôt de passer par un sytème type pkg-config, couplé avec automake ou autre. Mais je pense que l’op n’en est pas encore là, et c’est très bien au contraire de commencer par la base, de bien comprendre la signification de chacune des options, avec des makefile écris à la main et simples.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,
    Citation Envoyé par Neckara Voir le message
    Bonjour,


    Ce n'est qu'un avis personnel mais je pense qu'il faudrait bannir les options -I quand les bibliothèques ne sont pas dans une sous-répertoire du projet :
    Il y a rien de pire pour rendre le projet non-portable d'un ordinateur à l'autre.

    Pourquoi ne pas directement utiliser les options du type -lboost_system, -lboost_thread ?
    Ainsi toute personne voulant compiler ton code doit simplement installer correctement les bibliothèques sans à avoir à modifier le makefile.
    J'ai beau être, globalement, tout à fait d'accord avec toi, je ne peux m'empêcher de venir avec un grand: oui, mais... non...

    Le problème, c'est qu'aucun flag d'édition de lien n'est valide de manière systématique:
    -lboost_system et -lboost_thread (pour reprendre tes propres exemples), ne seront déjà valides que:
    si le chemin qui permet d'accéder aux fichier .a / .lib en question est valablement défini auprès de l'éditeur de lien
    si les bibliothèques en question ne sont pas agrémentées de valeurs propres comme la version de boost, le nom du compilateur utilisé ou encore le fait qu'il s'agisse d'une version debug, monothread ou multithread.

    Et c'est bien là tout le problème:
    1. les liens symboliques n'existent pas sous windows, et l'on ne peut donc même pas avoir la certitude que -lboost_system fonctionnera sous cet os
    2. Les chemins d'installations des bibliothèques sont globalement standard sous linux mais... joyeusement anarchiques sous windows (re ).
    Le fait est donc qu'il faudrait pouvoir laisser ces information à discrétion du système de configuration, mais, là aussi...

    autoconf, automake et consors ne sont, encore une fois, disponibles que sous linux, à moins d'utiliser msys ( re re )

    Je suis donc, dans le fond, plus que tout à fait d'accord avec toi, mais le pragmatisme de base éclaire malheureusement les chose d'une lumière bien sombe, non
    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

  17. #17
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 211
    Points
    23 211
    Par défaut
    Citation Envoyé par koala01 Voir le message
    [*]Les chemins d'installations des bibliothèques sont globalement standard sous linux mais... joyeusement anarchiques sous windows (re ).
    Sous Windows j'utilise généralement un IDE donc cela revient à installer la bibliothèque pour mon compilateur.

    Citation Envoyé par koala01 Voir le message
    [*]les liens symboliques n'existent pas sous windows, et l'on ne peut donc même pas avoir la certitude que -lboost_system fonctionnera sous cet os
    Je me suis déjà retrouvé avec ce même cas de figure avec lua v.5.0 ( -llua50 pour binder lua en C++) mais n'est-ce pas au contraire une bonne chose?
    Ceci permet d'avoir plusieurs version d'une même bibliothèque sans qu'il y ai de conflit entre elles et ainsi d'être sûr de compiler avec une bibliothèque 100% compatible avec notre code.
    Il me semble justement que la lib lua n'est pas très rétrocompatible.

    Bon après si on veut compiler pour toutes les plateformes, je pense qu'on utilisera plutôt cmake.

    Désolé pour ce petit HS

Discussions similaires

  1. Où trouver un exemple simple pour ajouter une fenêtre ?
    Par SuperSeb95 dans le forum Débuter
    Réponses: 3
    Dernier message: 26/05/2011, 08h50
  2. Recherche d'un exemple simple d'utilisation de MADS editor
    Par fedjo dans le forum SIG : Système d'information Géographique
    Réponses: 0
    Dernier message: 25/01/2011, 09h48
  3. [HTML 5] Exemple simple d'utilisation du offline
    Par greg69x dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 09/04/2010, 14h36
  4. Recherche d'un exemple simple d'utilisation d'une signature
    Par rambc dans le forum Général Python
    Réponses: 2
    Dernier message: 26/04/2009, 20h33
  5. Exemple simple utilisant le repository pattern
    Par Arthis dans le forum ASP.NET
    Réponses: 6
    Dernier message: 04/11/2008, 11h24

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