Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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