Création de librairie perso en C ?
Fermé
daleny31
Messages postés
222
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 janvier 2015
-
1 déc. 2010 à 20:26
daleny31 Messages postés 222 Date d'inscription samedi 25 octobre 2008 Statut Membre Dernière intervention 7 janvier 2015 - 10 déc. 2010 à 12:55
daleny31 Messages postés 222 Date d'inscription samedi 25 octobre 2008 Statut Membre Dernière intervention 7 janvier 2015 - 10 déc. 2010 à 12:55
A voir également:
- Création de librairie perso en C ?
- Creation compte gmail - Guide
- Création compte google - Guide
- Media creation tool - Télécharger - Systèmes d'exploitation
- Création organigramme - Guide
- Création groupe whatsapp - Guide
7 réponses
Nic0-
Messages postés
341
Date d'inscription
samedi 15 août 2009
Statut
Membre
Dernière intervention
16 février 2011
44
2 déc. 2010 à 03:05
2 déc. 2010 à 03:05
Salut
Par exemple t'as un fichier socket.c et socket.h (en plus du main, mais c'est qu'un exemple)
dans le socket.c tu fais un include du .h
et dans le fichier socket.h, tu mets les prototypes de tes fonction :
Mais c'est qu'un exemple hein, les #ifndef c'est pour être sûr que tu n'inclus les ficihes qu'une seule fois
Tes fonctions sont appelable d'un autre fichier si tu en fait l'include (par exemple du main.c)
Par exemple t'as un fichier socket.c et socket.h (en plus du main, mais c'est qu'un exemple)
dans le socket.c tu fais un include du .h
#include "socket.h" int initSocket (int *sock, struct sockaddr_in *sockname, struct hostent *host_address, config_t *config) { ... ... } int initSocketConnect (int *sock, config_t *config) { ... ... }
et dans le fichier socket.h, tu mets les prototypes de tes fonction :
#ifndef SOCKET_H_INCLUDED #define SOCKET_H_INCLUDED int initSocket (int *sock, struct sockaddr_in *sockname, struct hostent *host_address, config_t *config); int initSocketConnect (int *sock, config_t *config); #endif
Mais c'est qu'un exemple hein, les #ifndef c'est pour être sûr que tu n'inclus les ficihes qu'une seule fois
Tes fonctions sont appelable d'un autre fichier si tu en fait l'include (par exemple du main.c)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
2 déc. 2010 à 08:46
2 déc. 2010 à 08:46
Bonjour,
Le .h n'est pas une bibliothèque (librairie) mais le fichier d'en-tête. Ce n'est pas pareil. La bibliothèque est un fichier qui contient le code des fonctions tandis que le .h contient juste les prototypes.
Ensuite, il existe deux types de bibliothèques : les statiques, les dynamiques.
Tu souhaites faire une bibliothèque statique (plus simple à réaliser, mais le programme sera plus lourd) ou une bibliothèque dynamique (plus compliqué mais le programme sera plus léger (par contre la DLL devra être livré avec le programme)) ?
As-tu vraiment besoin de faire une bibliothèque ? Sinon tu peux tout simplement, mettre tes fonctions dans un autre fichier .c.
Merci de répondre à ces questions pour qu'on puisse t'aider plus précisément.
Cordialement,
Le .h n'est pas une bibliothèque (librairie) mais le fichier d'en-tête. Ce n'est pas pareil. La bibliothèque est un fichier qui contient le code des fonctions tandis que le .h contient juste les prototypes.
Ensuite, il existe deux types de bibliothèques : les statiques, les dynamiques.
Tu souhaites faire une bibliothèque statique (plus simple à réaliser, mais le programme sera plus lourd) ou une bibliothèque dynamique (plus compliqué mais le programme sera plus léger (par contre la DLL devra être livré avec le programme)) ?
As-tu vraiment besoin de faire une bibliothèque ? Sinon tu peux tout simplement, mettre tes fonctions dans un autre fichier .c.
Merci de répondre à ces questions pour qu'on puisse t'aider plus précisément.
Cordialement,
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
2 déc. 2010 à 09:39
2 déc. 2010 à 09:39
Pour faire suite à ce que dit Nic0, une fois que tu as mis tes fonctions dans un autre .c et mis toutes les déclarations dans un .h, il faut compiler. La compilation de plusieurs fichiers sources diffère un peu de la compilation d'un seul.
les .h ne se compilent pas, ce sont juste des déclarations qui seront automatiquement copier dans le fichier source au moment de la compilation. Il faut donc compiler les deux fichiers sources séparément en indiquant au compilateur de ne pas faire l'édition des liens (option -c avec gcc).
Tu as alors deux fichiers .o : main.o et autre.o.
Tes fonctions sont dans autre.o mais ton programme principale dans main.o, main.o ne connais pas la définition des fonctions qu'il utilise. Il faut alors lié les .o ensemble pour obtenir un exécutable.
Ensuite, à partir de autre.o, tu peux faire une bibliothèque statique te permettant d'utiliser facilement tes fonctions dans un autre programme.
les .h ne se compilent pas, ce sont juste des déclarations qui seront automatiquement copier dans le fichier source au moment de la compilation. Il faut donc compiler les deux fichiers sources séparément en indiquant au compilateur de ne pas faire l'édition des liens (option -c avec gcc).
Tu as alors deux fichiers .o : main.o et autre.o.
Tes fonctions sont dans autre.o mais ton programme principale dans main.o, main.o ne connais pas la définition des fonctions qu'il utilise. Il faut alors lié les .o ensemble pour obtenir un exécutable.
Ensuite, à partir de autre.o, tu peux faire une bibliothèque statique te permettant d'utiliser facilement tes fonctions dans un autre programme.
dharth
Messages postés
140
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
23 août 2012
13
2 déc. 2010 à 12:01
2 déc. 2010 à 12:01
sous unix :
- gcc -c fichier1.c fichier2.c (si tu veux faire une lib avec tout les fichier du répertoire courant : gcc -c *.c)
!! pas de fonction main() dans une lib!!
- ar rc nomlib.a *.o
- ranlib nomlib.a
ensuite pour compiler un programme avec cette lib :
- gcc main.c -L. -lnomlib (l'option -L définit le chemin, ici . pour le répertoire courant, attention le chemin doit être collé au -L; l'option -l correspond au nom de la lib, attention pas mettre le .a a la fin du nom et le nom doit être collé au -l)
- gcc -c fichier1.c fichier2.c (si tu veux faire une lib avec tout les fichier du répertoire courant : gcc -c *.c)
!! pas de fonction main() dans une lib!!
- ar rc nomlib.a *.o
- ranlib nomlib.a
ensuite pour compiler un programme avec cette lib :
- gcc main.c -L. -lnomlib (l'option -L définit le chemin, ici . pour le répertoire courant, attention le chemin doit être collé au -L; l'option -l correspond au nom de la lib, attention pas mettre le .a a la fin du nom et le nom doit être collé au -l)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Nic0-
Messages postés
341
Date d'inscription
samedi 15 août 2009
Statut
Membre
Dernière intervention
16 février 2011
44
2 déc. 2010 à 12:05
2 déc. 2010 à 12:05
Vous pensez vraiment qu'il souhaite faire une bibliothèque ? alors qu'il sait pas ce qu'un header ? :)
allons ! keep it simple, ne l'embrouillons pas (imho)
allons ! keep it simple, ne l'embrouillons pas (imho)
dharth
Messages postés
140
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
23 août 2012
13
2 déc. 2010 à 12:17
2 déc. 2010 à 12:17
en effet j'avais pas vu .h ^^
et bien c'est très simple, dans le fichier .c tu fait include "fichier.h"
et dans le .h tu met les prototypes de fonctions, les defines, les structures...
Pour la mise en forme c'est comme l'a dit Nic0-
et bien c'est très simple, dans le fichier .c tu fait include "fichier.h"
et dans le .h tu met les prototypes de fonctions, les defines, les structures...
Pour la mise en forme c'est comme l'a dit Nic0-
dharth
Messages postés
140
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
23 août 2012
13
2 déc. 2010 à 12:18
2 déc. 2010 à 12:18
petite précision importante, pour les includes, il faut bien mettre des "" pour le nom du fichier et non pas des <> qui sont réservé aux includes système!!
daleny31
Messages postés
222
Date d'inscription
samedi 25 octobre 2008
Statut
Membre
Dernière intervention
7 janvier 2015
8
10 déc. 2010 à 12:55
10 déc. 2010 à 12:55
Non c'est parfait, le probleme c'était les #ifndef...
MErci beaucoup...
MErci beaucoup...