Problème compilation, librairie en c, linux

Résolu
Utilisateur anonyme -  
mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je n'arrive pas à installer la librairie que nous donne notre école d'ingénieur chez moi.
On a une archive contenant la librairie, et un readme.txt dont le texte est le suivant:

Fichiers à télécharger pour utiliser la bibliothèque graphique libTableauNoir sur une machine personnelle. Pour l'utilisation, lire "manuel.pdf". 

Pour la compilation chez soi, sous Linux ou en environnement similaire (cygwin ou mingw sous Windows), suivre les étapes suivantes :  

    * s'assurer que les fichiers de développement de la librairie SDL sont présents sur le système. 
          o exemple sous Linux (debian ou ubuntu) 
            Taper dans un terminal : sudo apt-get install libsdl-dev 
    * décompresser l'archive lib_tableau_noir_sdl.tbz 
          o exemple sous Linux : dans un terminal, placer l'archive dans le répertoire courant et taper : 
            tar xvfj lib_tableau_noir_sdl.tbz 
    *  dans le terminal, se placer dans le répertoire contenant le fichier "configure", taper : 
        ./configure --prefix=<répertoire d'installation> 
      en remplaçant <répertoire d'installation> par /usr/local ou par autre chose si vous savez ce que vous faites 
    * taper ensuite : 
      make && make install 
    * Ajoutez les lignes suivantes dans le fichier .bashrc de votre répertoire personnel, en remplaçant <répertoire d'installation> par le répertoire choisi précédemment (sinon, tapez-les dans le terminal, mais il faudra le refaire à chaque fois que vous ouvrez un nouveau terminal pour travailler avec libTableauNoir) : 

export LIBRARY_PATH=<répertoire d'installation>/lib/tableaunoir:$LIBRARY_PATH 

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$LIBRARY_PATH 

export CPATH=<répertoire d'installation>/include:$CPATH 


    * L'archive contient un fichier d'exemple nommé "essai.c". Pour le compiler, une fois la librairie installée : 

      gcc -lTableauNoir essai.c -o essai 

Pour l'utilisation sur les machines de l'Institut Galilée, le fichier d'archive n'est pas nécessaire. Il suffit de taper, lors de la première utilisation, la ligne suivante dans un terminal : 

source ~antoine/libTableauNoir/update_bashrc 


seulement lorsque je compile mon programme voilà ce que j'obtiens:

/tmp/ccqDvUTO.o: In function 'main': 
vie.c:(.text+0x3b): undefined reference to 'creerTableau' 
vie.c:(.text+0x5b): undefined reference to 'chargerImage' 
vie.c:(.text+0x88): undefined reference to 'chargerImage' 
vie.c:(.text+0xb5): undefined reference to 'chargerImage' 
vie.c:(.text+0xe2): undefined reference to 'chargerImage' 
vie.c:(.text+0x10f): undefined reference to 'chargerImage' 
/tmp/ccqDvUTO.o:vie.c:(.text+0x13c): more undefined references to 'chargerImage' follow 
/tmp/ccqDvUTO.o: In function 'main': 
vie.c:(.text+0x3c1): undefined reference to 'fixerModeBufferisation' 
vie.c:(.text+0x428): undefined reference to 'fixerTaille' 
vie.c:(.text+0x4b9): undefined reference to 'tamponner' 
vie.c:(.text+0x4be): undefined reference to 'attendreClicGauche' 
vie.c:(.text+0x4cc): undefined reference to 'lireEtatSourisClavier' 
vie.c:(.text+0x512): undefined reference to 'effacerTableau' 
vie.c:(.text+0x54e): undefined reference to 'fixerTaille' 
vie.c:(.text+0x5df): undefined reference to 'tamponner' 
vie.c:(.text+0x5e4): undefined reference to 'attendreClicGauche' 
vie.c:(.text+0x5f2): undefined reference to 'lireEtatSourisClavier' 
vie.c:(.text+0x68f): undefined reference to 'effacerTableau' 
vie.c:(.text+0x6cb): undefined reference to 'fixerTaille' 
vie.c:(.text+0x78f): undefined reference to 'tamponner' 
vie.c:(.text+0x799): undefined reference to 'attendreClicGauche' 
vie.c:(.text+0x7a7): undefined reference to 'lireEtatSourisClavier' 
vie.c:(.text+0x87c): undefined reference to 'tamponner' 
vie.c:(.text+0x8c2): undefined reference to 'effacerTableau' 
vie.c:(.text+0x8c7): undefined reference to 'tamponner' 
vie.c:(.text+0x93e): undefined reference to 'tamponner' 
vie.c:(.text+0xa66): undefined reference to 'tamponner' 
vie.c:(.text+0xaaf): undefined reference to 'fixerTaille' 
vie.c:(.text+0xad3): undefined reference to 'choisirTypeStylo' 
vie.c:(.text+0xaef): undefined reference to 'choisirCouleurPinceau' 
vie.c:(.text+0xb94): undefined reference to 'tracerRectangle' 
vie.c:(.text+0xbe6): undefined reference to 'afficherImage' 
vie.c:(.text+0xbeb): undefined reference to 'tamponner' 
vie.c:(.text+0xcbf): undefined reference to 'attendreNms' 
vie.c:(.text+0xcc4): undefined reference to 'tamponner' 
vie.c:(.text+0xcd2): undefined reference to 'lireEtatSourisClavier' 
vie.c:(.text+0xd1f): undefined reference to 'effacerTableau' 
vie.c:(.text+0xd24): undefined reference to 'tamponner' 
vie.c:(.text+0xd37): undefined reference to 'fermerTableau' 
/tmp/ccqDvUTO.o: In function 'creer_quadrillage': 
vie.c:(.text+0xd92): undefined reference to 'choisirTypeStylo' 
vie.c:(.text+0xdae): undefined reference to 'choisirCouleurPinceau' 
vie.c:(.text+0xdea): undefined reference to 'tracerRectangle' 
vie.c:(.text+0xe88): undefined reference to 'tracerSegment' 
vie.c:(.text+0xf34): undefined reference to 'tracerSegment' 
/tmp/ccqDvUTO.o: In function 'faire_naitre_cellule': 
vie.c:(.text+0x10bc): undefined reference to 'choisirTypeStylo' 
vie.c:(.text+0x10d8): undefined reference to 'choisirCouleurPinceau' 
vie.c:(.text+0x11c6): undefined reference to 'tracerRectangle' 
/tmp/ccqDvUTO.o: In function 'tuer_cellule': 
vie.c:(.text+0x11f9): undefined reference to 'choisirTypeStylo' 
vie.c:(.text+0x1215): undefined reference to 'choisirCouleurPinceau' 
vie.c:(.text+0x1303): undefined reference to 'tracerRectangle' 
/tmp/ccqDvUTO.o: In function 'afficher_boutons': 
vie.c:(.text+0x14e0): undefined reference to 'afficherImage' 
collect2: ld a retourné 1 code d'état d'exécution 


toutes ces fonctions étant des fonctions de la librairie à installer.


j'aimerais savoir comment faire :S
aux chemins que j'ai inclus dans le .bashcr, j'ai:
-en /usr/local/lib/tableaunoir/ :
/usr/local/lib/tableaunoir/libTableauNoir.a 
/usr/local/lib/tableaunoir/libTableauNoir.la 
/usr/local/lib/tableaunoir/libTableauNoir.so 
/usr/local/lib/tableaunoir/libTableauNoir.so.0 
/usr/local/lib/tableaunoir/libTableauNoir.so.0.0.0 
/usr/local/lib/tableaunoir/TableauNoir.c


-et en /usr/local/include/ :
/usr/local/include/libTableauNoir.h

merci d'avance, je ne sais pas à quoi correspondent tous ces fichiers.

A voir également:

1 réponse

mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
Ton erreur vient du fait que tu oublies de passer les options de linkage à la compilation du fichier qui contient la fonction main().

Dans le cas général une compilation d'un module (fichier .c sans main) va être du genre :

gcc -W -Wall -c toto.c


... tant dis que celle du fichier c va être du genre (ici je linke avec libtutu.a et libplop.so :

gcc -W -Wall main.c toto.o tata.o titi.o libtutu.a -lplop


Note que pour une librairie dynamique (.so pour shared object) par convention le fichier ".so" doit avoir un nom qui commence par le préfixe lib. L'option -l attend le nom du fichier ".so" sans le préfixe "lib" ni l'extention ".so", ce qui donne -lplop. Par exemple écrire l'option "-lm" signifie "linke avec la librairie mathématique /usr/lib/libm.so".

Les fichier ".a" et ".so" sont cherchés par gcc dans les répertoires standards (/lib, /usr/lib, /usr/local/lib). Pour ajouter des chemins où espérer en trouver on utilise respectivement les options -L et -Wl,R.

Comme la compilation devient rapidement fastidieuse (beaucoup de commandes gcca vec plein d'options), je te conseille d'écrire un makefile pour la scripter.

Je t'invite aussi à lire ce fil de discussion plus détaillé qui rappelle toutes ces notions de compilation :
https://forums.commentcamarche.net/forum/affich-11131597-make-file-incluant-des-bibliotheques

Bonne chance
0
Utilisateur anonyme
 
mais simplement que dois-je faire? :S j'ai un peu de mal à comprendre je ne m'y connais pas du tout dans l'usage de librairies ^^'
0
Utilisateur anonyme
 
cette opération sur le .bashrc qu'on nous demande de faire n'est pas censée faire ces options de linkage? J'ai suivi le mode d'emploi à la lettre mais... :S
0
Utilisateur anonyme
 
j'ai réussi =)
Il me suffit de taper:
gcc vie.c -o vie -lTableauNoir -L/usr/local/lib/tableaunoir

j'ai pu réussir mon jeu de la vie grâce à toi ^^ merci!
0
mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
De rien bonne continuation !
0