Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 17 sur 17
  1. #1

    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 : -1
    Points
    -1

    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 émérite
    Inscrit en
    décembre 2008
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : décembre 2008
    Messages : 532
    Points : 801
    Points
    801

    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 :
    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

    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 : -1
    Points
    -1

    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

    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 : -1
    Points
    -1

    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 :
    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é Sénior Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    août 2004
    Messages
    2 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : août 2004
    Messages : 2 299
    Points : 4 424
    Points
    4 424

    Par défaut

    tu dois ajouter le chemin de boost dans ton makefile

  6. #6
    Membre émérite
    Inscrit en
    décembre 2008
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : décembre 2008
    Messages : 532
    Points : 801
    Points
    801

    Par défaut

    Code :
    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

    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 : -1
    Points
    -1

    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 émérite
    Inscrit en
    décembre 2008
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : décembre 2008
    Messages : 532
    Points : 801
    Points
    801

    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

    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 : -1
    Points
    -1

    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 :
    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 émérite
    Inscrit en
    décembre 2008
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : décembre 2008
    Messages : 532
    Points : 801
    Points
    801

    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 :
    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

    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 : -1
    Points
    -1

    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 :
    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
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 047
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 047
    Points : 4 821
    Points
    4 821

    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.

  13. #13
    Membre émérite
    Inscrit en
    décembre 2008
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : décembre 2008
    Messages : 532
    Points : 801
    Points
    801

    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
    Responsable Sécurité

    Avatar de Neckara
    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 676
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 676
    Points : 13 633
    Points
    13 633

    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 Expert
    Avatar de white_tentacle
    Inscrit en
    novembre 2008
    Messages
    1 265
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 1 265
    Points : 1 717
    Points
    1 717

    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
    Modérateur
    Avatar de koala01
    Profil pro Philippe Dunski
    Inscrit en
    octobre 2004
    Messages
    9 679
    Détails du profil
    Informations personnelles :
    Nom : Philippe Dunski
    Âge : 42

    Informations forums :
    Inscription : octobre 2004
    Messages : 9 679
    Points : 15 713
    Points
    15 713

    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
    Responsable Sécurité

    Avatar de Neckara
    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 676
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 676
    Points : 13 633
    Points
    13 633

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •