fichier header, libraries .. je pige plus

fichier header, libraries .. je pige plus - C - Programmation

Marsh Posté le 09-10-2005 à 23:58:21    

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
Reply

Marsh Posté le 09-10-2005 à 23:58:21   

Reply

Marsh Posté le 10-10-2005 à 02:10:49    

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.

Reply

Marsh Posté le 10-10-2005 à 04:25:51    

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.

Reply

Marsh Posté le 10-10-2005 à 05:29:40    

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.

Reply

Marsh Posté le 10-10-2005 à 09:25:14    

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/
Reply

Marsh Posté le 10-10-2005 à 09:27:27    

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/
Reply

Marsh Posté le 10-10-2005 à 10:01:38    

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

Reply

Marsh Posté le 10-10-2005 à 10:42:05    

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
Reply

Marsh Posté le 10-10-2005 à 10:56:45    

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
Reply

Marsh Posté le 10-10-2005 à 11:31:34    

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/
Reply

Marsh Posté le 10-10-2005 à 11:31:34   

Reply

Marsh Posté le 10-10-2005 à 13:15:27    

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 )-
Reply

Marsh Posté le 10-10-2005 à 13:30:18    


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/
Reply

Marsh Posté le 11-10-2005 à 08:26:17    

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


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 11-10-2005 à 10:44:29    

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


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 11-10-2005 à 10:46:48    

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:  

Reply

Marsh Posté le 11-10-2005 à 13:26:18    

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
Reply

Marsh Posté le 11-10-2005 à 16:57:44    

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
Reply

Marsh Posté le 11-10-2005 à 18:05:39    

in_your_phion a écrit :

"in your philisophy, once-over "


Et en anglais, ca donne quoi ?

Reply

Marsh Posté le 12-10-2005 à 10:18:19    

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 ..

Reply

Marsh Posté le 26-06-2007 à 18:22:30    

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
Reply

Marsh Posté le 26-06-2007 à 18:51:55    

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


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 26-06-2007 à 19:08:15    

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

Reply

Marsh Posté le 26-06-2007 à 21:20:51    

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.
Reply

Marsh Posté le 27-06-2007 à 00:04:09    

Merci grandement Sve@r.

Reply

Marsh Posté le 27-06-2007 à 07:54:18    

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.

Reply

Marsh Posté le 27-06-2007 à 09:38:53    

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.

Reply

Marsh Posté le 27-06-2007 à 14:56:16    

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.
Reply

Marsh Posté le 27-06-2007 à 17:42:58    

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]

Reply

Marsh Posté le 28-06-2007 à 09:27:43    

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é.

Reply

Marsh Posté le 28-06-2007 à 17:44:10    

Merci, je connais un peu le forum.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed