#1 Le 07/01/2009, à 08:10
- matifou
[Résolu] Compiler et exécuter un prog C avec librairie externe
Bonjour
Je découvre le C en essayant d'utiliser la bibliothèque Gnu Scientific Library (GSL), disponible depuis les paquets libgsl0-dev, libgsl0ldbl et gsl-bin .
J'essaie de compiler l'exemple tout simple (donné à la page http://www.gnu.org/software/gsl/manual/ … ogram.html):
#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>
int
main (void)
{
double x = 5.0;
double y = gsl_sf_bessel_J0 (x);
printf ("J0(%g) = %.18e\n", x, y);
return 0;
}
Un simple:
$gcc example.c -o example
/tmp/ccC7ubkh.o: In function `main':
example.c:(.text+0x21): undefined reference to `gsl_sf_bessel_J0'
collect2: ld a retourné 1 code d'état d'exécution
ne marche pas car il a besoin du paquet gsl, qui est dans /usr/include/gsl et il semble qu'il s'attend à /usr/share/include/gsl. Leur page (http://www.gnu.org/software/gsl/manual/html_node/Compiling-and-Linking.html) indique qu'il faut utiliser:
gcc -Wall -I/usr/local/include -c example.c
mais je me retrouve avec un fichier .o et je sais pas comment le lire:
$ ./example.o
bash: ./example.o : fichier binaire impossible à lancer
.
Comment dois-je faire pour lire l'exécutable?
Y'a-t-il un moyen de compiler plus rapidement/avec moins de commandes? De faire un lien dans /usr/share/include pour /usr/include?
Merci beaucou pour votre aide!
Dernière modification par matifou (Le 07/01/2009, à 09:00)
Hors ligne
#2 Le 07/01/2009, à 08:54
- mrlem
Re : [Résolu] Compiler et exécuter un prog C avec librairie externe
$gcc example.c -o example
/tmp/ccC7ubkh.o: In function `main':
example.c:(.text+0x21): undefined reference to `gsl_sf_bessel_J0'
collect2: ld a retourné 1 code d'état d'exécution
Là, ce n'est pas un problème d'include, mais de linker.
Il faut lier ton programme contre la lib GSL et ses pré-requis, par le biais de flags pouvant être obtenus grâce à la commande pkg-config :
gcc example.c $( pkg-config gsl --libs ) -o example
Hors ligne
#3 Le 07/01/2009, à 08:59
- matifou
Re : [Résolu] Compiler et exécuter un prog C avec librairie externe
Ouaa! magnifique!
C'est d'autant plus beau que je comprends rien... mais ça marche!
Merci beaucoup beaucoup!
Hors ligne
#4 Le 07/01/2009, à 09:30
- mrlem
Re : [Résolu] Compiler et exécuter un prog C avec librairie externe
Pour comprendre un peu plus, voici une petite décomposition :
1. en shell $( ... ) est remplacé par la sortie standard de la commande "..."
2. pkg-config gsl --libs : tu peux l'exécuter dans un bête terminal, et tu verras que ça retourne "-lgsl -lgslcblas -lm"
Késako ? çà veut dire que pour fonctionner, ton exécutable va devoir être lié à certaines bibliothèques (anglais : libraries, ou libs). Par exemple -lgsl dit de le lier à la lib GSL, ou /usr/lib/libgsl.so si on veut parler concrètement. De la même manière -lgslcblas => /usr/lib/libgslcblas.so et -lm => /usr/lib/libm.so (cette dernière est une bibliothèque de fonctions mathématiques générique dont dépend GSL).
Intuitivement, les includes servent à la compilation pour trouver les description des fonctions. Les libs servent à l'exécution, dans ton cas ce sont elles qui contiennent effectivement la partie exécutable de fonctions de la GSL (.so = shared object).
L'édition de liens sert donc à lier ton exécutable aux autres morceaux exécutables dont il a besoin. Tu peux revoir ces liens à postériori (i.e. à partir de ton exécutable) avec la commande :
ldd example
Hors ligne