Problème compilation, librairie en c, linux

Résolu/Fermé
Utilisateur anonyme - Modifié par mamiemando le 20/06/2012 à 21:40
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 21 juin 2012 à 09:58
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
20 juin 2012 à 21:47
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
20 juin 2012 à 22:33
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
20 juin 2012 à 23:32
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
21 juin 2012 à 01:39
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
21 juin 2012 à 09:58
De rien bonne continuation !
0