Ajouter une bibliothèque *.h

Fermé
randus - 25 mars 2005 à 14:24
 kmf - 25 mars 2005 à 16:26
Bonjour,
Je viens de réussir à installer linux 10.0 et je m'y connais pas trop
Mon but est de programmer quelque trucs en C

Le problème c'est que pour mes programme je dois faire appel à une bibliothèque qui n'est pas présente d'origine dans linux: "fonctionsblabla.h"

(pour utiliser àprès en entête de mon programme : "#include <fonctionsblabla.h>")
Voila comment la bibliothèque est organisée:
-un fichier *.ar (fonctionsblabla.ar)
-un fichier *.h (fonctionsblabla.h)
-une série de fichiers *.c (ce sont les fonctions )
-une série de fichiers *.o qui correspondent aux *.c ci dessus

Alors naïvement, j'ai copié tous ces fichiers dans usr/include (là ou il ya tous les *.h) mais après quand ds mes programmes je fais appel à une des fonctions de fonctionsblabla.h ya le diagnostic de fonction inconnue lors de la compilation.

Est ce que quelqu'un pourrait m'aider à intégrer la bibliothèque correctement?
Merci beaucoup

3 réponses

Je crois la reponse de BoNos ne rapporte rien. Le probleme me semble relie la confusion et ta comprehension ce que signifient exacement les fichiers: *.h et *.so et *.a !!


Comment est-ce que ca fonctionne avec les *.h et les bibliotheques ?

D'abord il y a deux types de bibliotheques:
(1) statique: libblabla.a
(2) dynamique: libblabla.so
Les deux ce trouvent souvent dans de repertoires comme /lib/..., /usr/lib/..., /usr/local/lib/..., /usr/X11R6/lib/... etc.

Dans le cas (1) si on compile un programe avec la bibliotheque, au moment de link (apres la compilation) le linker ("ld") va chercher dans le fichier "libblabla.a" les fonctions binaires deja compiles et les mettre ensemble avec ton programe nouvellement compile. Comme ca le programe sera plus grand (il y a ton propre code + le code exterieur de la bibiliotheque). Apres la compilation le programe peut tourner tout seul car il n'a plus besoin de la bibliotheque (qui est deja inclue avec lui).

Dans le cas (2) le linker ne va pas chercher les morceaux de code mais il va simplement creer un espece de lien entre ton programe et la bibliotheque en version dynamique: le "libblabla.so". Comme ca le programe est plus petit (seulement ton propre code) mais chaque fois quand on l'appelle le programe doit chercher et charger dans le memoire la bibliotheque dynamique. On dit aussi que le programe depend de la bibliotheque dynamique. On peut voir/visualiser cette dependance avec la commande:
"ldd programe.out"
et ca donnerait une affichage comme:
"programe.out -> /usr/lib/libblabla.so"
pour montrer cette dependance. Par defaut presque tous les programes
(a tres peu d'execptions pres) dependent de la bibliotheque standard-C qui s'appelle libc.so et qui se trouve dans /lib/... . Pour le programe grapique il peut y avoir 10-20 voire plus de dependances pour tout truc graphique (Xfree, qt, ...).


Maintenant, dans chaque bibliotheque il y a les fonctions qu'on peut utiliser et ces fonctions se trouvent a la fois dans libblabla.a et libblabla.so, la seule difference concerne la facon de lien: statique ou dynamique.

Cependant, qu'on tu ecris un programe faisant appel a de fonctions de la bibliotheque tu doit inclure les fichier *.h associe a la bibliotheque. Ces fichers contiennent les declarations des fonctions mais PAS le code ni en source ni en binaire!!
Les declarations ne font qu'une ligne par fonction pour etablir les regles d'appel des fonctions, par exemple combien de parametres, quel type de parametres etc. Comme ca le compilateur est capable de te dire qu'on tu as fait une faute avec ces regles. En plus les fichier.h contiennent aussi les definitions des structures de variables utilises par la bibliotheque (en C on peut definir de structures avec: "struct").
Par consequent, bien que l'inclusion des fichier *.h soit necessaire ce n'est
pas encores suffisant pour faire le lien avec la bibliotheque. Pour ca il faut aussi dire au compilateur de prendre la bibliotheque en question pour faire le lien avec le programe soit en statique ou soit en dynamique. Par exemple tu dois taper:
gcc programe.c -o programe.out -lblabla

si tu veux faire un lien avec "libblabla.a" ou "libblabbla.so". Si tu ne mets pas le "-lblabla" le gcc ne saura pas faire le lien. Dans ce cas la compilation seul passera mais le link apres plante pour manque de fonctions qu'on a essaye de les utiliser sans qu'elles soient presentes!

C'est probablement ca ce que tu as observe et pas un probleme avec le fichier.h!!

Je rappelle le fichier.h ne contient pas les fonctions, seulement leur declarations. Il faut toujours chercher les fonctions dans la bibliotheque.
De plus meme si on ajoute la bonne option "-lblabla" pour faire le lien ce n'est peut-etre pas encore suffisant si la bibliotheque ne se trouve pas dans endroit standart (/usr/lib/... par exemple). Si le repertoire n'est pas standard il faut aussi ajouter "-Lrepertoire_bibliotheque" pour que ca marche!

Apres pour la question si on veut faire avec statique et dynamique c'est un peu automatique (je crois). Si le gcc ne trouve que libblabla.a et pas l'autre (le *.so) il fait en statique. S'il trouve l'autre il fait en dyamique. On peut aussi utiliser les options "-statique", "-dynamique" mais c'est un peu complique.
2
IL suffit que tu fasse un

#include"/home/toto/libraire.h"

dans les prog .c qui utilisent ta librairie
tu met des guillemets au lieu des <>
0
Complement: Concernant ta bibliotheque tu devrais avoir un fichier *.a qui devrait s'appeller lib(.....).a. Le fichier *.ar est proche mais je ne suis pas sur si c'est exactement le meme. Normalement si tu installes une bibliotheque a partir des source (a partir d'un tar avec: "./configure", "make" et "make install") ca installe tous les fichiers au bons endroits, par exemples les *.h dans /usr/local/include/... et le *.a dans /usr/local/lib/...
Apres il suffit d'ajouter la bonne option "-l(...)" au gcc pour l'utilisation (et aussi d'avoir les bonnes #include ...).
Regardes un peu les options de gcc avec "man gcc" ou "info gcc" comment ca marche en detail. Ce qui est sur tu dois inclure le fichier *.a ou *.so (si tu en as un).

Je crois entre *.ar et *.a il y a une facon de transformer l'un vers l'autre mais normalement c'est fait automatiquement avec "make install" en utilisant les commandes "ar" et "ranlib". Regarde la doc avec "man ar" et "man ranlib". On peut faire a la main mais c'est un peu complique.
0