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

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

Marsh Posté le 18-11-2013 à 19:42:36    

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

Reply

Marsh Posté le 18-11-2013 à 19:42:36   

Reply

Marsh Posté le 18-11-2013 à 21:17:41    

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 ?

Reply

Marsh Posté le 18-11-2013 à 21:26:02    

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

Reply

Marsh Posté le 18-11-2013 à 21:29:37    

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"

Reply

Marsh Posté le 18-11-2013 à 21:35:29    

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

Reply

Marsh Posté le 18-11-2013 à 21:42:25    

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.

Reply

Marsh Posté le 18-11-2013 à 21:55:53    

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

Reply

Marsh Posté le 18-11-2013 à 21:59:27    

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.

Reply

Marsh Posté le 18-11-2013 à 22:28:01    

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

Reply

Marsh Posté le 19-11-2013 à 20:16:54    

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

Reply

Marsh Posté le 19-11-2013 à 20:16:54   

Reply

Marsh Posté le 19-11-2013 à 20:30:09    

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

Reply

Marsh Posté le 19-11-2013 à 20:55:27    

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:

Reply

Marsh Posté le 20-11-2013 à 09:02:04    

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.

Reply

Marsh Posté le 20-11-2013 à 23:02:02    

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:  
 

Reply

Marsh Posté le 20-11-2013 à 23:21:39    

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.

Reply

Marsh Posté le 21-11-2013 à 03:07:29    

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

Reply

Marsh Posté le 21-11-2013 à 15:35:49    

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.

Reply

Marsh Posté le 21-11-2013 à 17:25:57    

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

Reply

Marsh Posté le 21-11-2013 à 22:13:10    

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:

Reply

Marsh Posté le 22-11-2013 à 13:37:24    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed