# Linker librairie gsl avec compilateur GCC



## momovelo (9 Février 2016)

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:

```
########################################################################
# 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
		
Cliquez pour agrandir...



Et pourtant: 



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

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

Cliquez pour agrandir...



Merci de votre aide!
Cordialement._


----------



## bompi (9 Février 2016)

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.


----------



## momovelo (9 Février 2016)

Ok et comment faire? Je suis un vrai novice dans le milieu..


----------



## Nyx0uf (9 Février 2016)

Ajouter ça devrait suffire ?


```
-L/usr/local/Cellar/gsl/1.16/lib
```


```
-I/usr/local/Cellar/gsl/1.16/include
```


----------



## momovelo (9 Février 2016)

Non ça m'affiche une nouvelle erreur:


> wu-etu-02321:Librairie_AlgebreLineaire jeremymartinon$ make
> 
> Makefile:45: *** missing separator.  Stop.


----------



## Nyx0uf (9 Février 2016)

On peut avoir le projet pour regarder?


----------



## bompi (9 Février 2016)

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.


----------



## momovelo (9 Février 2016)

Comment ça le projet? ^^


----------



## bompi (9 Février 2016)

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é.


----------



## momovelo (9 Février 2016)

Quelque chose comme ça? (Je suis un novice de chez novice hein^^.)

```
########################################################################
# 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)
```


----------



## momovelo (9 Février 2016)

Mais pour vous le problème ne se situe pas ici?


> _*clang: warning: -lgsl: 'linker' input unused
> 
> clang: warning: -lcblas: 'linker' input unused*_


----------



## Nyx0uf (9 Février 2016)

Je demandais à ce que le fichiers soient uploadés quelque part qu'on puisse les télécharger.


----------



## momovelo (9 Février 2016)

Oui, avec plaisir:
http://uptobox.com/87ykhspeux24


----------



## Nyx0uf (9 Février 2016)

Si ca build pas, faire un make clean avant.

```
########################################################################
# 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)
```


----------



## momovelo (9 Février 2016)

J'ai ceci:


----------



## Mboum (9 Février 2016)

momovelo a dit:


> J'ai ceci:



Bonjour,


```
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.


```
-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.


```
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.


----------



## momovelo (10 Février 2016)

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


----------



## bompi (10 Février 2016)

momovelo a dit:


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


----------



## Mboum (10 Février 2016)

momovelo a dit:


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


----------



## momovelo (17 Février 2016)

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.


----------



## Mboum (17 Février 2016)

Bonjour,

si vous mettiez votre projet en téléchargement accessible (pas une plateforme de pue des pieds) je pourrais faire quelque chose. Et deux TPs? vous ne pouvez pas booter une linux box sur un vieux portable? quand on cherche on trouve ; vous êtes dans la catégorie des "mouxes" ou "touristes". 

Cordialement.


----------

