Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/01/2013, 13h59   #1
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
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.
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 15h23   #2
cob59
Membre chevronné
 
Inscription : décembre 2008
Messages : 490
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 490
Points : 753
Points : 753
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).
cob59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 15h41   #3
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
Points : -1
Points : -1
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 :

Citation:
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.
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 16h55   #4
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
Points : -1
Points : -1
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.
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 17h01   #5
fregolo52
Expert Confirmé Sénior
 
Avatar de fregolo52
 
Homme
Développeur C
Inscription : août 2004
Messages : 2 078
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur C

Informations forums :
Inscription : août 2004
Messages : 2 078
Points : 4 027
Points : 4 027
tu dois ajouter le chemin de boost dans ton makefile
fregolo52 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 17h07   #6
cob59
Membre chevronné
 
Inscription : décembre 2008
Messages : 490
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 490
Points : 753
Points : 753
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 ?
cob59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 14h07   #7
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
Points : -1
Points : -1
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
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 14h46   #8
cob59
Membre chevronné
 
Inscription : décembre 2008
Messages : 490
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 490
Points : 753
Points : 753
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.
cob59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 11h07   #9
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
Points : -1
Points : -1
Lorsque je compile le fichier d'exemple, et que j' éxécute le fichier ./a.out, j'obtiens ceci :

Citation:
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 :
Citation:
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.
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 11h56   #10
cob59
Membre chevronné
 
Inscription : décembre 2008
Messages : 490
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 490
Points : 753
Points : 753
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] << " ";
}
cob59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 16h00   #11
humanite
 
Homme
Apprenti
Inscription : décembre 2010
Messages : 81
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Apprenti

Informations forums :
Inscription : décembre 2010
Messages : 81
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
humanite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 16h09   #12
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 551
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 551
Points : 4 102
Points : 4 102
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.
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 16h56   #13
cob59
Membre chevronné
 
Inscription : décembre 2008
Messages : 490
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 490
Points : 753
Points : 753
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.
cob59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 20h30   #14
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 612
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 612
Points : 7 162
Points : 7 162
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
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.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 20h44   #15
white_tentacle
Membre Expert
 
Avatar de white_tentacle
 
Inscription : novembre 2008
Messages : 973
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 973
Points : 1 180
Points : 1 180
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.
white_tentacle est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2013, 21h12   #16
koala01
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 8 626
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 41

Informations forums :
Inscription : octobre 2004
Messages : 8 626
Points : 13 346
Points : 13 346
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
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
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
koala01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 21h33   #17
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 612
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 612
Points : 7 162
Points : 7 162
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
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
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h30.


 
 
 
 
Partenaires

Hébergement Web