Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1463 connectés 

  FORUM HardWare.fr
  Programmation
  C

  fichier header, libraries .. je pige plus

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

fichier header, libraries .. je pige plus

n°1219148
in_your_ph​ion
Posté le 09-10-2005 à 23:58:21  profilanswer
 

bonjour,
 
je cherche un tutorial sur la compilation en C ... Je suis un peu perdu au niveau de la comprehension des fichiers .h, des libaries .. Par exemple, si j'utilise la librarie de maths, je dois compiler avec -lm ET aussi inclure le header <math.h>, pourquoi ?  
 
Aussi, pourquoi est ce que quand j'apelle une fonction dans mon fichier principal qui n'est pas déclarée, le programme compile (avec un warning ).  
 
Enfin, c'est quoi l'interêt de redéclarer les prototypes de ses fonctions dans un .h ??
 
merci par avance   :love:  :love:  :love:

Message cité 2 fois
Message édité par in_your_phion le 10-10-2005 à 00:02:36
mood
Publicité
Posté le 09-10-2005 à 23:58:21  profilanswer
 

n°1219195
rnoizet
Posté le 10-10-2005 à 02:10:49  profilanswer
 

Ce que je vois comme intérêt, c'est pour de la réutilisation.  
 
On voit d'un coup d'oeil toutes les fonctions et les constantes dans le .h, et on n'a normalement pas besoin de se plonger dans le code pour savoir comment les utiliser. Ca permet aussi aux gens qui font des librairies qui ne sont pas supposées être modifiées de donner accès au .o et au .h, au lieu du .c et du .h .
 
Il y a peut-être des avantages autres que ceux-ci, mais je ne m'y connais pas assez au niveau du processus de compilation.

n°1219204
matafan
Posté le 10-10-2005 à 04:25:51  profilanswer
 

C'est pas une question d'avantage, c'est que ça ne peut pas marcher sans. Le .h sert a "exporter" les déclarations pour que tu puisses les utiliser dans ton programme. C'est indispensable car le compilo a besoin de savoir le type des arguments attendus par une fonction, et le type de valeur qu'elle retourne. Il ne peut pas deviner ça en regardant simplement les appels que tu fais.
 
D'autre part le .h permet aussi de faire connaître au compilo les types (typedefs, structures) définis dans le librairies et utilisés dans ton programme. Sans le .h, comment le compilo connaîtrait-il les offsets et la taille des champs dans une structure ?
 
Et puis il y a éventuellement les #define et tout le reste qui sont dans le .h... Bref dans le .h il y a tout ce dont le compilo a besoin pour que la lib et le programme se comprennent.

n°1219207
rnoizet
Posté le 10-10-2005 à 05:29:40  profilanswer
 

Voilà, parce que tu peux mettre du code C dans ton fichier .h. Finalement, l'avantage c'est d'avoir le fichier .c correspondant pour mettre le merdier dedans et faire un truc clair.

n°1219246
Emmanuel D​elahaye
C is a sharp tool
Posté le 10-10-2005 à 09:25:14  profilanswer
 

in_your_phion a écrit :

je cherche un tutorial sur la compilation en C ... Je suis un peu perdu au niveau de la comprehension des fichiers .h, des libaries .. Par exemple, si j'utilise la librarie de maths, je dois compiler avec -lm ET aussi inclure le header <math.h>, pourquoi ?  
 
Aussi, pourquoi est ce que quand j'apelle une fonction dans mon fichier principal qui n'est pas déclarée, le programme compile (avec un warning ).  
 
Enfin, c'est quoi l'interêt de redéclarer les prototypes de ses fonctions dans un .h ??


http://mapage.noos.fr/emdel/notes.htm#bibliotheque
http://mapage.noos.fr/emdel/codage [...] ser_source
http://mapage.noos.fr/emdel/codage.htm#organiser
 
Pose des questions si tu ne comprends pas.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1219249
Emmanuel D​elahaye
C is a sharp tool
Posté le 10-10-2005 à 09:27:27  profilanswer
 

rnoizet a écrit :

Voilà, parce que tu peux mettre du code C dans ton fichier .h.


Le dernier qui a mis du code C dans un .h chez nous est en train de sécher dans un faux plafond...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1219272
Sve@r
Posté le 10-10-2005 à 10:01:38  profilanswer
 

in_your_phion a écrit :

bonjour,
 
je cherche un tutorial sur la compilation en C ... Je suis un peu perdu au niveau de la comprehension des fichiers .h, des libaries .. Par exemple, si j'utilise la librarie de maths, je dois compiler avec -lm ET aussi inclure le header <math.h>, pourquoi ?  
 
Aussi, pourquoi est ce que quand j'apelle une fonction dans mon fichier principal qui n'est pas déclarée, le programme compile (avec un warning ).  
 
Enfin, c'est quoi l'interêt de redéclarer les prototypes de ses fonctions dans un .h ??


http://fr.lang.free.fr/cours/Gener [...] t_v1.0.pdf

n°1219323
in_your_ph​ion
Posté le 10-10-2005 à 10:42:05  profilanswer
 

Merci pour vos réponses les gars  :D  
 

Emmanuel Delahaye a écrit :

Pose des questions si tu ne comprends pas.


 
en fait il y a toujours deux trucs que je comprend pas :
 
1 - Pourquoi quand j'utilise une librairie, par exemple math, je dois appeler -lm à la compilation ET math.h dans le code. Pourquoi pas seulement -lm lors de la compilation ? ou alors juste le .h ?
 
2 - A quoi ca sert de mettre un #ifndef dans un .h ?  
 
  :love: merci par avance  :love:

Message cité 2 fois
Message édité par in_your_phion le 10-10-2005 à 10:43:43
n°1219332
Sve@r
Posté le 10-10-2005 à 10:56:45  profilanswer
 

in_your_phion a écrit :

Merci pour vos réponses les gars  :D  
 
 
 
en fait il y a toujours deux trucs que je comprend pas :
 
1 - Pourquoi quand j'utilise une librairie, par exemple math, je dois appeler -lm à la compilation ET math.h dans le code. Pourquoi pas seulement -lm lors de la compilation ? ou alors juste le .h ?
 
2 - A quoi ca sert de mettre un #ifndef dans un .h ?  
 
  :love: merci par avance  :love:


 
Si tu lisais déjà les liens, il y a tout dessus... enfin je vais répondre !!!
 
1) si, dans ton pgm, tu veux utiliser la fonction "sqrt" (fonction recevant un double et renvoyant un double si je me souviens bien), tu es obligé de prévenir le compilo que tu vas utiliser cette fonction donc tu es obligé de la déclarer avant son utilisation sinon le compilo la considèrera au mieux de type "int" par défaut ou alors il va râler (ça dépend des compilateurs).
 
Donc tu es obligé de mettre son prototype "double sqrt(double);" en début de ton pgm.
Le header de ta librairie contient tous les prototypes des fonctions de la librairie donc en incluant "math.h", t'as plus à le faire.
 
2) ayant bien compris le point "1", tu es tout fier de tes nouvelles connaissances et tu inclus "math.h" paske tu vas utiliser la librairie "libm.a" et "toto.h" paske tu veux utiliser la librairie "libtoto.a". Malheureusement (et ça tu ne le sais pas), "toto.h" inclu déjà "math.h" pask'il en a besoin. Cela produit un effet indésirable appelé "idempotence" où tout ce qu'il y a dans "math.h" est maintenant écrit 2 fois dans ton pgm. Et ça, le compilo n'aime généralement pas.
 
Pour éviter ce pb, les header officiels protègent leurs code par un "ifndef truc" puis un "define truc". Comme ça, lors de la première inclusion, "truc" n'est pas défini et tout le code du header est inclu, mais à la 2° inclusion, "truc" est déjà défini et le code du header n'est pas ré-inclu dans ton pgm.


Message édité par Sve@r le 10-10-2005 à 10:58:54
n°1219357
Emmanuel D​elahaye
C is a sharp tool
Posté le 10-10-2005 à 11:31:34  profilanswer
 

in_your_phion a écrit :

1 - Pourquoi quand j'utilise une librairie, par exemple math, je dois appeler -lm à la compilation ET math.h dans le code. Pourquoi pas seulement -lm lors de la compilation ? ou alors juste le .h ?


 
Visiblement, tu as du mal à faire la différence entre un fichier d'entête et une bibliothèque.
 
Une bibliothèque de fonction est un ensemble de fonctions précompilées mises à la disposition du codeur, et qui se compose de 2 entités qui sont i'interface et l'implémentation.
 

  • L'interface (.h ou entête, header...) définit les macros, constantes, types, et prototypes qui servent à l'utilisation des fonctions. Il ne contient pas le code des fonctions.
  • L'implémentation (.c ou source) iinclue le fiichier d'entête (pour des raisons évidentes de cohérence) et contient la dérfinition des fonctions.


Il n'y a aucun mystère, et il est facile de tester tout ça soi-même. (J'ai donné un exemple sur mon site, liens déjà fournis).
 
Pour utiliser les fonctions, on inclue le .h et pour que le code des fonctions soit accessible, on ajoute la bibliothèque au projet (par exemple : -lm)

Citation :


2 - A quoi ca sert de mettre un #ifndef dans un .h ?  


Si tu parles de ça :  


/* mylib.h */
#ifndef H_MYLIB
#define H_MYLIB
 
/* interface */
 
#endif /* guard */


c'est un mécanisme de protection contre les inclusions multiples dans un même 'module' (le terme exact est 'unité de compilation'. Un .c quoi...).
 
P.S. Let my 'phion' alone... (Y'a de ces pseudos...)


Message édité par Emmanuel Delahaye le 10-10-2005 à 13:23:08

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 10-10-2005 à 11:31:34  profilanswer
 

n°1219442
blackgodde​ss
vive le troll !
Posté le 10-10-2005 à 13:15:27  profilanswer
 

Emmanuel Delahaye a écrit :

Le dernier qui a mis du code C dans un .h chez nous est en train de sécher dans un faux plafond...


 
j'adore  :love:


---------------
-( BlackGoddess )-
n°1219460
Emmanuel D​elahaye
C is a sharp tool
Posté le 10-10-2005 à 13:30:18  profilanswer
 


BlackGoddess, c'est plutôt genre
http://www.forum-auto.com/uploads/200501/babylon00_7_1106359259_ds_noire__2_.jpg
ou
http://www.forum-auto.com/uploads/200406/dug.pierre_1086106915_thallia_maximal2_003.jpg
???


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1220127
el muchach​o
Comfortably Numb
Posté le 11-10-2005 à 08:26:17  profilanswer
 

C'est le premier, demande à Taz. :D


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1220228
blackgodde​ss
vive le troll !
Posté le 11-10-2005 à 10:44:29  profilanswer
 

1er oui, mais jveux bien la 2eme par contre :]


---------------
-( BlackGoddess )-
n°1220231
in_your_ph​ion
Posté le 11-10-2005 à 10:46:48  profilanswer
 

All right ! Je crois que je commence à piger  :D  La feignasse que je suis vous remercie gracieusement pour votre gratitude.  :love:  
 
 
ps : in_your_phion ..  qu'est-ce qu'il a mon pseudo ?  :sweat:  

n°1220341
Sve@r
Posté le 11-10-2005 à 13:26:18  profilanswer
 

in_your_phion a écrit :

All right ! Je crois que je commence à piger  :D  La feignasse que je suis vous remercie gracieusement pour votre gratitude.  :love:  


Notre gratitude ? Cela voudrait donc dire qu'on t'es redevable de quelque chose ???
 

in_your_phion a écrit :

ps : in_your_phion ..  qu'est-ce qu'il a mon pseudo ?  :sweat:


Il y a juste qu'on ne sait pas trop ce que tu mets in_our_phion et que cela risque de nous faire naître beaucoup de sentiments divers mais la "gratitude" n'en fera pas partie !!!

Message cité 1 fois
Message édité par Sve@r le 11-10-2005 à 13:53:39
n°1220564
in_your_ph​ion
Posté le 11-10-2005 à 16:57:44  profilanswer
 

Sve@r a écrit :

Notre gratitude ? Cela voudrait donc dire qu'on t'es redevable de quelque chose ???
 
 
Il y a juste qu'on ne sait pas trop ce que tu mets in_our_phion et que cela risque de nous faire naître beaucoup de sentiments divers mais la "gratitude" n'en fera pas partie !!!


 
haha .. mais oui, vous m'êtes redevable de tout !  vous me devez tout, ô oui  :D  .. euh non sérieusement  en fait c'est dans l'autre sens, je voulais dire que la feignasse que je suis vous envoie toute sa gratitude  :p  
 
ps : in_your_phion c'est la "concatenation+absorbption" de "in your philisophy, once-over "  :sol:  y'a vraiment des esprits mal tournés à ce que je vois ! ..

Message cité 1 fois
Message édité par in_your_phion le 11-10-2005 à 17:02:41
n°1220627
matafan
Posté le 11-10-2005 à 18:05:39  profilanswer
 

in_your_phion a écrit :

"in your philisophy, once-over "


Et en anglais, ca donne quoi ?

n°1221007
in_your_ph​ion
Posté le 12-10-2005 à 10:18:19  profilanswer
 

matafan a écrit :

Et en anglais, ca donne quoi ?


 
quand je traduit avec google il me dit que c'est "in your philosophy, ounce-over" .. va savoir ce que ca veut dire ..

n°1579542
Thordax
Shop smart. Shop S-Mart !
Posté le 26-06-2007 à 18:22:30  profilanswer
 

Yop les gens !

 

J'ai également un bleme avec les headers et librairies, sur un prog tout simple (prenons le cas de hello world, avec une fonction hello dans hello.c, une référence à hello() dans le hello.h, et un main dans main.c)

 

Les trois fichiers sont donc les suivants :
hello.h :

Code :
  1. #ifndef FONCTIONS_H
  2. #define FONCTIONS_H
  3. #include <stdio.h>
  4. void hello(void);
  5. #endif
 

hello.c :

Code :
  1. #include <stdio.h>
  2. #include "hello.h"
  3. void hello(void)
  4. {
  5.         printf("Hello World!\n" );
  6. }
 

Et le main.c :

 
Code :
  1. #include <stdio.h>
  2. #include "hello.h"
  3. main(){
  4.         hello();
  5. }
 

Le problème, est, quand je compile la lib d'un côté et le main de l'autre, tout foire :/

 

gcc -c hello.o hello.c =>
In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status (alors que le fichier ne contient pas de main)

 

et gcc -o main.o main.c =>
undefined reference to `hello'
collect2: ld returned 1 exit status

 

Quelqu'un a-t-il une idée du problème ?

 

Merci d'avance !

Message cité 1 fois
Message édité par Thordax le 26-06-2007 à 18:22:59
n°1579550
zecrazytux
Posté le 26-06-2007 à 18:51:55  profilanswer
 

ba oui ta aps de main dans ton hello.c !


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
n°1579555
Thordax
Shop smart. Shop S-Mart !
Posté le 26-06-2007 à 19:08:15  profilanswer
 

ah, je colle un main, et je mets rien dedans, en gros ?

n°1579600
Sve@r
Posté le 26-06-2007 à 21:20:51  profilanswer
 

Ouah le vieux topic moisi !!!
 

Thordax a écrit :

ah, je colle un main, et je mets rien dedans, en gros ?


ABSOLUMENT PAS !!!
 

Thordax a écrit :


Le problème, est, quand je compile la lib d'un côté et le main de l'autre, tout foire :/
 
gcc -c hello.o hello.c =>  
In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status (alors que le fichier ne contient pas de main)
 
et gcc -o main.o main.c =>  
undefined reference to `hello'
collect2: ld returned 1 exit status
 
Quelqu'un a-t-il une idée du problème ?


Oui => Faut apprendre les options de compilation de gcc au lieu de taper au petit bonheur...
 
1) il te faut demander au compilo de créer les modules objets à partir de tes sources. Le compilo ne fait que vérifier la syntaxe de chaque source et te génère AUTOMATIQUEMENT le .o correspondant
gcc -c hello.c
gcc -c main.c
 
2) si la phase 1 est totalement ok, alors il te faut demander de créer l'exécutable en utilisant les ".o" que t'as généré, et éventuellement les ".a" dont t'aurais besoin (ce topic parlait de "libm.a" donc on peut imaginer que t'en aies besoin, par exemple pour calculer une racine carrée). C'est ce qu'on nomme l'édition des liens (les liens entre les ".o" seront tissés afin que toute fonction appelée soit trouvée)
gcc hello.o main.o /usr/lib/libm.a -o nomExécutable
 
Tout ceci est expliqué dans ce lien http://fr.lang.free.fr/cours/Gener [...] t_v1.0.pdf que j'avais déjà donné dans ce topic !!!!


Message édité par Sve@r le 26-06-2007 à 21:24:34

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1579688
Thordax
Shop smart. Shop S-Mart !
Posté le 27-06-2007 à 00:04:09  profilanswer
 

Merci grandement Sve@r.

n°1579718
matafan
Posté le 27-06-2007 à 07:54:18  profilanswer
 

En général quand on a une question on ouvre un nouveau sujet, on ne post pas dans un topic vieux de presque deux ans.

n°1579746
Thordax
Shop smart. Shop S-Mart !
Posté le 27-06-2007 à 09:38:53  profilanswer
 

Je veux pas polluer le forum avec mes questions de noube, d'où mon postage ici, d'autant que le topic porte plutôt bien son nom, par rapport à ma question.

n°1579938
Sve@r
Posté le 27-06-2007 à 14:56:16  profilanswer
 

Thordax a écrit :

Je veux pas polluer le forum avec mes questions de noube, d'où mon postage ici, d'autant que le topic porte plutôt bien son nom, par rapport à ma question.


Tout à fait. On ne compte plus les types qui viennent poser une question qui a été posée 350 fois et à qui il est répondu "t'aurais cherché sur le fofo t'aurais eu la réponse". Toi au moins on voit que t'as cherché... :sol:


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1580056
Thordax
Shop smart. Shop S-Mart !
Posté le 27-06-2007 à 17:42:58  profilanswer
 

Sve@r a écrit :

Tout à fait. On ne compte plus les types qui viennent poser une question qui a été posée 350 fois et à qui il est répondu "t'aurais cherché sur le fofo t'aurais eu la réponse". Toi au moins on voit que t'as cherché... :sol:


Après, cela a été maigrement fructueux car je n'ai même pas pu choper la réponse par moi même, mais l'idée était là [:tinostar]

n°1580209
matafan
Posté le 28-06-2007 à 09:27:43  profilanswer
 

Ben oui mais le principe c'est : tu cherches, si tu trouves tant mieux pas besoin de poster quoi que ce soit, si tu trouves pas la réponse tu ouvres un nouveau topic. J'ai pas dit qu'il fallait pas chercher. Sinon ça fait bizarre quand on voit remonter un vieux topic auquel on a déja participé. On ne comprend pas forcément immédiatement ce qui c'est passé.

n°1580525
Thordax
Shop smart. Shop S-Mart !
Posté le 28-06-2007 à 17:44:10  profilanswer
 

Merci, je connais un peu le forum.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  fichier header, libraries .. je pige plus

 

Sujets relatifs
VS 2003 : tester si un fichier est présent dans projet de déploiement[VBS] et fichier excel
Update d'un fichier XML (PHP 5)Supprimer une ligne spécifique dans un fichier
Extraire le résultat d'un commande dos vers un fichierFichier .fla qui ne s'ouvre pas .!!!
[vbs] Test d'existance de fichierAnalyse d'un fichier XML avec son schéma xsd
copier le contenu d'un fichier texte dans un fichier html[C#] Impression d'un fichier pdf
Plus de sujets relatifs à : fichier header, libraries .. je pige plus


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR