Linker librairie gsl avec compilateur GCC

momovelo

Membre confirmé
9 Février 2016
14
0
30
Bonjour,
A la fac, ce semestre j'ai un cours intitulé "Méthodes Numériques". En gros c'est des mathématiques appliqués à la programmation, appliqué à la physique. On est sensé travailler sur les pc de la fac tournant sous ubuntu mais bon; les mac étant bâtis comme linux je me suis dis que je bosserai sur mon mac. J'ai donc installé gsl et root (Xcode était déjà présent) mais, problème, lors de la compilation mon ordi n'arrive pas à liker la librairie gsl.

Lors de mon premier TP on nous a demandé de télécharger un pack de fichier avec les .cpp des headers et un MakeFile. On m'a expliqué que le MakeFile était là pour éviter d'avoir à se retaper toutes les commandes de compilations à chaque fois.

Voici le contenue du MakeFile:
Bloc de code:
########################################################################
# Makefile pour le TP 4 : Algèbre Linéaire #############################
########################################################################
# <-- ( Ceci est un commentaire )

# Règles standard ######################################################

# Ajoutez ici votre propre executable, après "exemple"...
all: exemple libalglin.a

# Attention ici !
clean:
    rm -f *.o exemple libalglin.a

# Compilation des classes ##############################################

Vecteur.o: Vecteur.cpp Vecteur.h
    g++ -c -o Vecteur.o  Vecteur.cpp

MatriceCarree.o: MatriceCarree.cpp MatriceCarree.h Vecteur.h
    g++ -c -o MatriceCarree.o  MatriceCarree.cpp

VecMat.o: VecMat.cpp VecMat.h Vecteur.h MatriceCarree.h
    g++ -c -o VecMat.o  VecMat.cpp

SysLin.o: SysLin.cpp SysLin.h Vecteur.h MatriceCarree.h
    g++ -c -o SysLin.o  SysLin.cpp

# Compilation du/des programme(s) #######################################

exemple.o: exemple.cpp Vecteur.h MatriceCarree.h VecMat.h
    g++ -c -o exemple.o  exemple.cpp  -lgsl -lcblas

# Edition de liens #####################################################

exemple: exemple.o Vecteur.o MatriceCarree.o VecMat.o
    g++ -o exemple  exemple.o Vecteur.o MatriceCarree.o VecMat.o -lgsl -lgslcblas

# Construction d'une bibliotheque ######################################

lib: libalglin.a

libalglin.a: Vecteur.o MatriceCarree.o VecMat.o
    ar rcs libalglin.a  Vecteur.o MatriceCarree.o VecMat.o

#NB : pour les developpeurs
#fichiers à inclure : CPLUS_INCLUDE_PATH (au lieu de -I)
#librairies à inclure : LIBRARY_PATH (au lieu de -L)

Problème, lorsque je rentre la commande make il m'affiche un message d'erreur:
Last login: Tue Feb 9 13:24:21 on ttys000

-bash: root-config: command not found

wu-etu-02321:Librairie_AlgebreLineaire jeremymartinon$ make

g++ -c -o exemple.o exemple.cpp -lgsl -lcblas

clang: warning: -lgsl: 'linker' input unused

clang: warning: -lcblas: 'linker' input unused

In file included from exemple.cpp:3:

In file included from ./VecMat.h:4:

./Vecteur.h:8:10: fatal error: 'gsl/gsl_vector.h' file not found

#include <gsl/gsl_vector.h>

^

1 error generated.

make: *** [exemple.o] Error 1


Et pourtant:
wu-etu-02321:Librairie_AlgebreLineaire jeremymartinon$ locate gsl/gsl_vector.h

/usr/local/Cellar/gsl/1.16/include/gsl/gsl_vector.h


Merci de votre aide!
Cordialement.
 
L'entête recherché n'est sans doute pas dans la liste des dossiers parcourus par le compilateur (en fait le précompilateur) pour les trouver.
Par défaut, des dossiers genre /usr/include seront pris en compte, mais ceux qui se trouvent dans une "cellier" (de Homebrew ?) ne le sont pas : il faut modifier le fichier Makefile pour le faire explicitement. Et ajouter /usr/local/Cellar/ via une option passée au compilateur.

Je déplace côté développement, puisque c'est là le sujet.
 
Pour la partie des entêtes, il te faut ajouter aux appels à g++ des options de type : -Idir donc quelque chose comme : -I/usr/local/Cellar/gsl
Et ainsi de suite pour les autres dossiers éventuels.
De même, il faudra sans doute ajouter des options(-Ldir) pour localiser les bibliothèques à lier lors de l'édition des liens.
Je te conseille de regarder la page de manuel de g++.

Commence par modifier les lignes avec g++. Par la suite, on pourra voir comment faire cela proprement.
 
Comment ça le projet? ^^
1455033389-capture-d-ecran-2016-02-09-a-16-55-16.png
 
Par exemple un projet au sens XCode. Mais cela ne peut pas être le cas ici car ton projet (au sens général) est destiné à être réalisé sur Linux aussi.
Dans ton cas c'est un classique sources+Makefile et zou! on compile...

Essaye déjà ce que je t'ai indiqué.
 
Quelque chose comme ça? (Je suis un novice de chez novice hein^^.)
Bloc de code:
########################################################################
# Makefile pour le TP 4 : Algèbre Linéaire #############################
########################################################################
# <-- ( Ceci est un commentaire )

# Règles standard ######################################################

# Ajoutez ici votre propre executable, après "exemple"...
all: exemple libalglin.a

# Attention ici !
clean:
    rm -f *.o exemple libalglin.a

# Compilation des classes ##############################################

Vecteur.o: Vecteur.cpp Vecteur.h
    g++ -c -o Vecteur.o  Vecteur.cpp -I/usr/local/Cellar/gsl

MatriceCarree.o: MatriceCarree.cpp MatriceCarree.h Vecteur.h
    g++ -c -o MatriceCarree.o  MatriceCarree.cpp -Idir

VecMat.o: VecMat.cpp VecMat.h Vecteur.h MatriceCarree.h
    g++ -c -o VecMat.o  VecMat.cpp -Idir

SysLin.o: SysLin.cpp SysLin.h Vecteur.h MatriceCarree.h
    g++ -c -o SysLin.o  SysLin.cpp -Idir

# Compilation du/des programme(s) #######################################

exemple.o: exemple.cpp Vecteur.h MatriceCarree.h VecMat.h
    g++ -c -o exemple.o  exemple.cpp  -lgsl -lcblas -Idir

# Edition de liens #####################################################

exemple: exemple.o Vecteur.o MatriceCarree.o VecMat.o
    g++ -o exemple  exemple.o Vecteur.o MatriceCarree.o VecMat.o -lgsl -lgslcblas -Idir

# Construction d'une bibliotheque ######################################

lib: libalglin.a

libalglin.a: Vecteur.o MatriceCarree.o VecMat.o
    ar rcs libalglin.a  Vecteur.o MatriceCarree.o VecMat.o

#NB : pour les developpeurs
#fichiers à inclure : CPLUS_INCLUDE_PATH (au lieu de -I)
#librairies à inclure : LIBRARY_PATH (au lieu de -L)
 
Si ca build pas, faire un make clean avant.
Bloc de code:
########################################################################
# Makefile pour le TP 4 : Algèbre Linéaire #############################
########################################################################
# <-- ( Ceci est un commentaire )

# Règles standard ######################################################

# Ajoutez ici votre propre executable, après "exemple"...
all: exemple libalglin.a

# Attention ici !
clean:
    rm -f *.o exemple libalglin.a

# Compilation des classes ##############################################

Vecteur.o: Vecteur.cpp Vecteur.h
    g++ -c -o Vecteur.o  Vecteur.cpp

MatriceCarree.o: MatriceCarree.cpp MatriceCarree.h Vecteur.h
    g++ -c -o MatriceCarree.o  MatriceCarree.cpp

VecMat.o: VecMat.cpp VecMat.h Vecteur.h MatriceCarree.h
    g++ -c -o VecMat.o  VecMat.cpp

SysLin.o: SysLin.cpp SysLin.h Vecteur.h MatriceCarree.h
    g++ -c -o SysLin.o  SysLin.cpp

# Compilation du/des programme(s) #######################################

exemple.o: exemple.cpp Vecteur.h MatriceCarree.h VecMat.h
    g++ -c -o exemple.o  exemple.cpp  -lgsl -lcblas -L/usr/local/Cellar/gsl/1.16/lib -I/usr/local/Cellar/gsl/1.16/include

# Edition de liens #####################################################

exemple: exemple.o Vecteur.o MatriceCarree.o VecMat.o
    g++ -o exemple  exemple.o Vecteur.o MatriceCarree.o VecMat.o -lgsl -lgslcblas -L/usr/local/Cellar/gsl/1.16/lib -I/usr/local/Cellar/gsl/1.16/include

# Construction d'une bibliotheque ######################################

lib: libalglin.a

libalglin.a: Vecteur.o MatriceCarree.o VecMat.o
    ar rcs libalglin.a  Vecteur.o MatriceCarree.o VecMat.o

#NB : pour les developpeurs
#fichiers à inclure : CPLUS_INCLUDE_PATH (au lieu de -I)
#librairies à inclure : LIBRARY_PATH (au lieu de -L)
 

Bonjour,

Bloc de code:
Makefile:45: *** missing separator. Stop.

// le makefile contient des CRLF ; LF uniquement.
// voir: http://www.gnu.org/software/make/manual/make.html#Error-Messages

essayer de ``quoter`` les ``paths``, je suspect le "." d'être problématique.

Bloc de code:
-L"/usr/local/Cellar/gsl/1.16/lib" -I"/usr/local/Cellar/gsl/1.16/include"

ou bien alors l'installation de Cellar contient des symlinks relatives.

Bloc de code:
host:~ user$ open /usr/local/Cellar
pour voir dans le finder.

P.S: n'utiliser point locate sous BSD-OSX, la db n'est jamais mise à jour, faites un find et s'il vous plait écrivez des makefile utilisant les variables prédéfinies comme CFLAGS, CXXFLAGS, CCFLAGS et LDFLAGS: http://www.gnu.org/software/make/manual/ c'est quand même plus facile lorsque l'on tâtonne de pouvoir les passer en arguments ; ne prenez pas des mauvaises habitudes.

Cordialement.
 
Dernière édition:
Le truc c'est que ce n'est pas moi qui ai écris le MakeFile mais mes enseignant.

Je pense, au final, que le plus raisonnable est d'utiliser VirtualBox afin de faire tout mes travaux de programmation sous Linux..
 
Le truc c'est que ce n'est pas moi qui ai écris le MakeFile mais mes enseignant.

Je pense, au final, que le plus raisonnable est d'utiliser VirtualBox afin de faire tout mes travaux de programmation sous Linux..
Pourquoi pas. D'un autre côté, ça te permet aussi de comprendre comment ça marche.
 
Le truc c'est que ce n'est pas moi qui ai écris le MakeFile mais mes enseignants.

Bonjour,

et? pas besoins d'imiter un scribouillard ; qu'il soit prof ou prétende être ingénieur? c'est l'essentiel du savoir de l'ingénieur savoir identifier ce qui doit être et écarter tout ce qui n'est pas conforme, le reste ce ne sont que des outils ; ce n'est pas vos enseignants devant lesquels vous passerez des entretiens ; qu'ils vivent dans l' à peu près universitaire ; c'est leur problème, prenez ce qu'il y a d'intéressant chez eux et laisser de côté leurs idioties, il faut être pro-actif dans la vie.

Virtual box fonctionne aussi, mais bon, j'ai l'impression que vous laissez tomber au premier désagrément mineur et ne cherchez point à le résoudre, ici vous êtes un peu comme le chasseur qui tire des mouches au fusil.

Cordialement.
 
Le truc c'est que ça fait déjà deux TP, soit 8h, que je bute sur ce problème. Et pendant ce temps la les autres avance pendant que moi je stagne. Un moment il faut savoir être raisonnable et faire des concessions.