Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1421 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Problème utilisation deux librairies en même temps g++

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème utilisation deux librairies en même temps g++

n°2210686
naneba2
Posté le 18-11-2013 à 19:42:36  profilanswer
 

Bonjour a tous,
Je suis coincée !!
 
Je dois utiliser deux librairies: "boost" et "gsl"
Je suis sous windows 7 et j'utilise g++ par le biais de l'invité de commande.
 
En utilisant seulement la librairie boost (dans le répertoire C:\) voila la commande donnée pour la compilation (ça fonctionne!):
 

Code :
  1. g++ MCMC.cpp -c -I"C:\boost_install" -L"C:\boost_install\lib"


 
J'ai aussi installé le dossier de ma librairie "gsl" dans le répertoire C:\ et la quand je demande:
 

Code :
  1. g++ MCMC.cpp -c -I"C:\boost_install" -L"C:\boost_install\lib" -I"C:\gsl\include" -L"C:\gsl\lib"


 
Il ne retrouve plus ces petits i.e. les .h de la librairie gsl ...
 
J'imagine que je ne peux pas définir deux fois des -I et -L mais comment dois-je procéder alors? Faut-il que je mette tout dans le même dossier?
 
 
Une idée :)  ?
Merci beaucoup,
Nane

mood
Publicité
Posté le 18-11-2013 à 19:42:36  profilanswer
 

n°2210692
xilebo
noone
Posté le 18-11-2013 à 21:17:41  profilanswer
 

Tu peux bien enchainer les -I pour inclure autant de répertoire include que nécessaire
 
Par contre les -L sont pour inclure les chemins des bibliothèque, ce n'est pas nécessaire à la compilation mais au link.
 
Quelles sont les erreurs de ton compilateur ?

n°2210696
naneba2
Posté le 18-11-2013 à 21:26:02  profilanswer
 

xilebo a écrit :

Tu peux bien enchainer les -I pour inclure autant de répertoire include que nécessaire
 
Par contre les -L sont pour inclure les chemins des bibliothèque, ce n'est pas nécessaire à la compilation mais au link.
 
Quelles sont les erreurs de ton compilateur ?


 
Bonjour xilebo!
 
Le message d'erreur est : fatal error: gsl_math.h: No such file or directory
compilation terminated.

 
Il s'agit du premier .h demandé de cette librairie...
#include <gsl_math.h>
 
Aurais-tu une idée alors pour lui indiquer les deux chemins??
 
Je te remercie,
Nane

n°2210697
xilebo
noone
Posté le 18-11-2013 à 21:29:37  profilanswer
 

essaie de mettre des double \ dans tes chemins car il me semble que c est le caractère d'échappement sur la console windows
 
du genre :  
 

Code :
  1. g++ MCMC.cpp -c -I"C:\\boost_install" -L"C:\\boost_install\\lib" -I"C:\\gsl\\include" -L"C:\\gsl\\lib"

n°2210698
naneba2
Posté le 18-11-2013 à 21:35:29  profilanswer
 

Hélas... toujours la même erreur...
 
Sinon, je peux peut être fusionner les deux dossier ?
 "C:\boost_install\lib" et  "C:\gsl\lib"
 
 

n°2210700
xilebo
noone
Posté le 18-11-2013 à 21:42:25  profilanswer
 

essaie de remplacer les "\\" par des "/" , g++ devrait les accepter.
 
Mais avant tout, assure toi que les noms de répertoire sont les bons, et que le fichier attendu se trouve bien dans c:\\gsl\\include car c'est le seul endroit où le compilateur cherche.

n°2210702
naneba2
Posté le 18-11-2013 à 21:55:53  profilanswer
 

:) :) :) :)
En fait une erreur bête: dans le fichier gsl\include, il y aussi un dossier nommée gsl... le chemin d'accès n'était pas le bon, en remplaçant par:
 
gsl\include\gsl , je n'ai plus d'erreur à la compilation!
 
Merci encore!
 
Et penses-tu que le double link passera?? je n'ai pas encore finit d'écrire ma fonction utilisant cette librairie....

n°2210703
xilebo
noone
Posté le 18-11-2013 à 21:59:27  profilanswer
 

il suffit de tester ce qui marche et ce qui ne marche pas. Je suis juste étonné que le backslash seul ( \ )  soit accepté dans la syntaxe étant donné qu'il doit s'agir du caractère d'échappement de la console windows , sauf erreur.

n°2210705
naneba2
Posté le 18-11-2013 à 22:28:01  profilanswer
 

Effectivement ça passe avec un simple "\" ...
 
Merci encore,
Nane

n°2210893
naneba2
Posté le 19-11-2013 à 20:16:54  profilanswer
 

Bon... encore moi  :pfff:  
 
Je viens d'écrire ma fonction utilisant la librairie gsl:

Code :
  1. #include <gsl/gsl_math.h>
  2. #include <gsl/gsl_randist.h>
  3. #include <gsl/gsl_rng.h>
  4. double test_multinomial (void)
  5. {
  6.   const size_t K = 3;
  7.   const unsigned int sum_n = 100;
  8.   unsigned int n[3];
  9.   /* Test use of weights instead of probabilities. */
  10.   const double p[] = { 2., 7., 1.};
  11.   gsl_ran_multinomial( r_global, K, sum_n, p, n);
  12.   return n[0];
  13. }


 
a la compilation: pas de problèmes mais au moment du "link" j'obtiens le message d'erreur suivant:

Code :
  1. Commande g++:         g++ MCMC.o
  2. undefined reference to `gsl_ran_multinomial`
  3. colloct2.exe: error: ld returned 1 exit status


 
Je crois avoir un problème dans la définition de mes deux -L ...
Comment faire?
 
Merci encore   :)

mood
Publicité
Posté le 19-11-2013 à 20:16:54  profilanswer
 

n°2210895
xilebo
noone
Posté le 19-11-2013 à 20:30:09  profilanswer
 

le -L permet de donner le chemin des bibliothèques. Mais ca ne suffit pas. Le linker ne peut pas deviner quelle bibliothèque prendre, il faut lui indiquer avec -l.
 
Par contre, sous windows, je ne sais pas s'il faut retirer ou non le préfixe "lib" du nom de la bibliothèque. Sous linux, si ta bibliothèque s'appelle libgsl ( .so , .a ) , tu indiques au linker la bibliothèque de la facon suivante : -lgsl et non -llibgsl.
 
Sous windows, il est probable que ta bibliothèque soit un .lib ( ou pas ). Donc si ta bibliothèque se nomme libgsl.lib ( par exemple) essaie avec -lgsl

n°2210899
naneba2
Posté le 19-11-2013 à 20:55:27  profilanswer
 

Effectivement sous windows, ma bibliothèque se note "gsl.lib" (enfin il y en plusieurs dans le dossier gsl\lib\ )
 
Je viens d'essayer de faire comme tu me l'a indiqué, mais toujours rien, il ne reconnait pas la fonction.
(Mais la compilation se passe sans problèmes; avec mes deux -L et -I) ...
 
J'ai aussi essayer de copier les .lib du "gsl" dans le dossier de "boost" mais rien n'y fait...
 
Je désespère un peu...   :pfff:

n°2210983
xilebo
noone
Posté le 20-11-2013 à 09:02:04  profilanswer
 

Je pense que tu confonds compilation et édition des liens ( ou link ).
 
La compilation est une première phase qui traduit ton code source en binaire. C'est en gros le "g++ -c". A cette phase tu n'as besoin que de préciser les includes avec -I
 
Une 2ème phase est l'édition des liens. Tu réunis les objets entre eux pour produire une bibliothèque ou un binaire exécutable. Cela se fait avec l'option -o. Tu peux ( tu dois ) à cette phase préciser le chemin des bibliothèques d'une part, et préciser la bibliothèque à utiliser d'autre part.
 
Par exemple tu peux compiler 2 fichiers cpp de la facon suivante :

Code :
  1. g++ -c a.cpp -I chemin/des/includes/de/boost -I chemin/des/includes/de/gsl
  2. g++ -c b.cpp -I chemin/des/includes/de/boost -I chemin/des/includes/de/gsl
  3. g++ -c main.cpp -I chemin/des/includes/de/boost -I chemin/des/includes/de/gsl


 
Cette première phase va te générer 3 objets a.o et b.o et main.o correspondant au code de tes 3 fichiers a.cpp et b.cpp et main.cpp. Pas besoin des bibliothèques à cette phase.
 
On suppose que main.cpp contient ton point d'entrée d'exécutable soit la fonction main().
 
Ensuite à l'édition des liens, pour produire ton exécutable tu dois faire la chose suivante :
 

Code :
  1. g++ -o monexecutable a.o b.o c.o -L chemin/des/lib/de/boost -L chemin/des/libs/de/gsl -lboost -lgsl


 
Si tu ne précises pas quelles bibliothèques ( avec -l ) , il va y avoir des références à des fonctions dans a.o b.o main.o ( toutes les fonctions que tu auras pu utiliser de boost et/ou gsl ) mais g++ ne les trouvera pas, et il te ressort une erreur. Tu précises donc à g++ d'utiliser telle ou telle bibliothèque avec -l. La syntaxe que je t'ai mise est celle sous linux, je ne connais pas celle sous windows il faut que tu te documentes à ce sujet. ( normalement elle devrait être identique ). le -L sert à indiquer le ou les chemins dans lesquels chercher les bibliothèques car g++ ne va pas les trouver tout seul non plus.
 
pour info, sous linux, toutes les bibliothèques doivent être préfixées par "lib". Ainsi la libgsl sous linux, pour être utilisée, devrait s'appeler libgsl.a ( .a c est l extension d'une lib statique sous linux ). Pour l'utiliser on met alors dans ligne -lgsl. Si la bibliothèque n'a pas le préfixe lib , le linker ne pourra jamais la trouver ( sauf avis contraire, je ne connais pas tout ).
 
Pourquoi je te dis ca : je vois que ta bibliothèque se nomme gsl.lib. Essaie de la renommer libgsl.lib ou même libgsl.a , je ne sais pas ce qu'attends ton linker quand tu mets -lgsl. Je ne sais pas si on peut également préciser le nom complet avec une autre option ce qu'il te faudrait.

n°2211143
naneba2
Posté le 20-11-2013 à 23:02:02  profilanswer
 

Merci beaucoup Xilebo pour tes explications...je comprends mieux!!  
Mais ça ne veux pas marcher...
 
En fait mon problème vient de la librairie GSL uniquement, avec boost aucun soucis...  
Je l'ai réinstallé du coup, ici:  
http://sourceforge.net/projects/mi [...] p/download
 
J'ai re-essayé en utilisant tous tes conseils i.e. pour un petit programme test du genre:
http://www.gnu.org/software/gsl/ma [...] ogram.html
 
Voila les commandes demandées dans l'invité:

Code :
  1. g++ -std=c++0x -c test.cpp  -I"C:\GSL_test2\include"


Aucuns problèmes, puis:

Code :
  1. g++  test.o  -L"C:\GSL_test2\lib" -lgsl -lgslcblas


Et le message d'erreur:

Code :
  1. test.o:test.cpp:(.text+0x29): undefined reference to `gsl_sf_bessel_J0'
  2. collect2.exe: error ld returned 1 exit status


 
J'ai bien dans mon fichier "C:\GSL_test2\lib" deux fichiers nommés "libgsl.a" et "libgslcblas.a"  :pt1cable:  
 
Quand je demande les librairies dans mon invité de commande

Code :
  1. g++ -print-search-dirs


Je tombe sur une multitude de lignes (illisibles!) où toutes ont l'air de  faire appel à mingw64 ....
 
 :fou:   :fou:   :fou:  
 

n°2211145
tpierron
Posté le 20-11-2013 à 23:21:39  profilanswer
 

Hmm, il me semble qu'il y ait un petit problème dans ce que tu décris. Tu dis avoir installé cette version de GNU SL:
 

Code :
  1. http://sourceforge.net/projects/mi [...] p/download


 
Puis que :

Code :
  1. Je tombe sur une multitude de lignes (illisibles!) où toutes ont l'air de  faire appel à mingw64 ....


 
Donc tu as mixé une dll 32bits avec un compilateur 64bits. Ça ne peut pas fonctionner, il faut qu'il ait correspondance au niveau de l'architecture.

n°2211150
naneba2
Posté le 21-11-2013 à 03:07:29  profilanswer
 

Bien vu tpierron et merci!
 
Je viens donc de télécharger la version 64 bits ici
 
http://wiki.rglab.org/index.php?ti [...] ows_binary
 
et de suivre la procédure indiquée  
mais toujours la même erreur...
 
HELP :)

n°2211239
tpierron
Posté le 21-11-2013 à 15:35:49  profilanswer
 

Hmm, je ne sais pas ce que tu utilises pour compiler ton programme (IDE, makefile ou à la main), mais je viens de tester avec la version 32bits de GSL et ça fonctionne avec le programme d'exemple (du moins, ça compile, mais la variable r_global n'est pas initialisée).
 
Bref, ce sont les lignes de commande que j'ai utilisé (MinGW32):

Code :
  1. mingw32-gcc.exe -Wall  -g    -Iinclude -IC:\MinGW\include  -c C:\GSL_test2\gsl.c -o obj\gsl.o
  2. mingw32-g++.exe -LC:\MinGW\lib  -o .\gsl.exe obj\gsl.o    lib\libgsl.a


 
Le répertoire de travail se trouve dans C:\GSL_test2. Le fichier source s'appelle gsl.c. Aucune erreur à la compilation/édition de lien.
 
Bref, tu as certainement dû mélanger tes dll (32/64bits), ou ta ligne de commande pointe au mauvais endroit.

n°2211248
naneba2
Posté le 21-11-2013 à 17:25:57  profilanswer
 

Je pense que tu as raison... il doit y avoir pas mal de bugs dans mes installations...  
 
N'ayant plus trop le temps de chercher une solution à ce problème, j'ai choisi une solution de facilité: j'ai installer Dev-c++ dans lequel je peux spécifier "simplement" ou se trouvent mes librairies, mes includes, etc...
ET CA FONCTIONNE!
 
En tous cas, je vous remercie beaucoup tpierron et xilebo.
 
Nane

n°2211284
naneba2
Posté le 21-11-2013 à 22:13:10  profilanswer
 

Alors..  :pt1cable:  (je viens de trouver une solution)  :p :
 
Dans mon cas,  
Il faut non pas que je lui définisse       -L"C:\GSL\lib"    
mais lui donner plutôt l'adresse direct de la librairie:     C:\GSL\lib\libgsl.a
 
Ce qui donne:

Code :
  1. g++ -c test.cpp -I"C:\GSL\include"
  2. g++ test.o C:\GSL\lib\libgsl.a
  3. a


 
Merci encore à tous  :hello:

n°2211341
xilebo
noone
Posté le 22-11-2013 à 13:37:24  profilanswer
 

oups, j'avais oublié de préciser cela.
 
le -l est pour des bibliothèques dynamiques. Pour des bibliothèques statiques, on ajoute directement la bibliothèque de la même manière qu'un .o , comme tu viens justement de le faire.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Problème utilisation deux librairies en même temps g++

 

Sujets relatifs
problème condition ifprobleme base de registre
Problème d'ouverture de port COMCalcul des rendements d'une action au cours du temps avec vba
Problème pour la carte de France avec OsclassOutil calcul temps génération de la page serveur
Java's cool 4 - Proglet polyominos - problème !Problème avec innerHTML
ssh2 et readdir problème 
Plus de sujets relatifs à : Problème utilisation deux librairies en même temps g++


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR