IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

probleme librairie statique


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Points : 110
    Points
    110
    Par défaut probleme librairie statique
    bonsoir a tous,

    alors voila je me suis fais une petite librairie statique mais en voulant tester les includes dans une simple programme il m' affiche des erreurs a la compilation:

    mais avant voici les divers manipes que j'ai fait:

    mon make
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    .SILENT:
     
    SERVEUR = ./Serveur
    CLIENT = ./Client
    FONCTION = ./fonctionPartagee
    OUT = ./out
    OBJ = $(SERVEUR)/socketSer.o $(CLIENT)/socketCli.o $(FONCTION)/fonctionPartagee.o
    CC = cc -I$(OUT) -I$(SERVEUR) -I$(CLIENT) -I$(FONCTION)
    LIB = $(OUT)/socketSer.o $(OUT)/socketCli.o $(OUT)/fonctionPartagee.o
     
     
    all: $(LIB)
     
    $(OUT)/socketSer.o:	$(SERVEUR)/socketSer.h $(SERVEUR)/socketSer.c $(OUT)/fonctionPartagee.o
    	echo Compilation de socketSer.o
    	$(CC) -c $(SERVEUR)/socketSer.h $(SERVEUR)/socketSer.c $(OUT)/fonctionPartagee.o
    	mv socketSer.o $(OUT)
     
    $(OUT)/socketCli.o:	$(CLIENT)/socketCli.h $(CLIENT)/socketCli.c $(OUT)/fonctionPartagee.o
    	echo Compilation de socketCli.o
    	$(CC) -c $(CLIENT)/socketCli.h $(CLIENT)/socketCli.c $(OUT)/fonctionPartagee.o
    	mv socketCli.o $(OUT)
     
    $(OUT)/fonctionPartagee.o:	$(FONCTION)/fonctionPartagee.h $(FONCTION)/fonctionPartagee.c
    	echo Compilation de fonctionPartagee.o
    	$(CC) -c $(FONCTION)/fonctionPartagee.h $(FONCTION)/fonctionPartagee.c
    	mv fonctionPartagee.o $(OUT)
    clean:
    	@rm -f $(SERVEUR)/*.o
    	@rm -f $(SERVEUR)/*.*~
    	@rm -f $(SERVEUR)/*~
    	@rm -f $(SERVEUR)/*.gch
    	@rm -f $(CLIENT)/*.o
    	@rm -f $(CLIENT)/*.*~
    	@rm -f $(CLIENT)/*~
    	@rm -f $(CLIENT)/*.gch
    	@rm -f $(FONCTION)/*.o
    	@rm -f $(FONCTION)/*.*~
    	@rm -f $(FONCTION)/*~
    	@rm -f $(FONCTION)/*.gch
    	@rm -f $(OUT)/*.o
    	@rm -f $(OUT)/*.*~
    	@rm -f $(OUT)/*~
    	@rm -f $(OUT)/*.gch
    lib:
     
    	@ar -rcsv libmySocket.a $(OUT)/socketSer.o $(OUT)/socketCli.o $(OUT)/fonctionPartagee.o
    le resultat du make :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Compilation de fonctionPartagee.o
    ./fonctionPartagee/fonctionPartagee.c: In function ‘getMessage’:
    ./fonctionPartagee/fonctionPartagee.c:26: warning: incompatible implicit declaration of built-in function ‘memset’
    Compilation de socketSer.o
    cc: ./out/fonctionPartagee.o: linker input file unused because linking not done
    Compilation de socketCli.o
    cc: ./out/fonctionPartagee.o: linker input file unused because linking not done
    ensuite j 'ai cree l'archive grace a make lib:

    ensuite mon prog de teste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include"socketSer.h"
    int main(){
    	printf("ok");
    return 1;
    }
    a la compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gcc t.c -static -L. -lmySocket
    t.c:1:22: error: socketSer.h: Aucun fichier ou dossier de ce type
    t.c: In function ‘main’:
    t.c:3: warning: incompatible implicit declaration of built-in functionprintf
    voici le tree de mes repertoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    .
    |-- Client
    |   |-- socketCli.c
    |   |-- socketCli.h
    |   `-- socketCli.h.gch
    |-- Serveur
    |   |-- socketSer.c
    |   |-- socketSer.h
    |   `-- socketSer.h.gch
    |-- fonctionPartagee
    |   |-- fonctionPartagee.c
    |   |-- fonctionPartagee.h
    |   `-- fonctionPartagee.h.gch
    |-- fonctionPartagee.c~
    |-- libmySocket.a
    |-- makefile
    |-- makefile~
    |-- out
    |   |-- fonctionPartagee.o
    |   |-- socketCli.o
    |   `-- socketSer.o
    |-- t.c
    `-- t.c~

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 739
    Points : 31 068
    Points
    31 068
    Billets dans le blog
    1
    Par défaut
    Quand tu écris include "machin.h", le compilo va chercher "machin.h" d'après son nom Unix. Donc ici, le compilo qui compile ton pgm de test cherche le fichier "socketSer.h" à l'endroit où se trouve ledit pgm. Or, le fichier "socketSer.h" se trouve dans le sous-dossier "Serveur"

    3 solutions:
    1) tu remplaces include "socketSer.h" par include "serveur/socketSer.h"

    2) tu crées un lien à l'endoit où se trouve ton source vers "serveur/socketSer.h"

    3) tu remplaces include "socketSer.h" par include <socketSer.h> et tu mets "-Iserveur" dans tes flags de compilation...

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Points : 110
    Points
    110
    Par défaut
    oui mais je me suis fait ma libbrairie libmySocket.a et c'est avec ca que j'ai travaille

    elle contient : fonctionPartagee.o socketSer.o socketCli.o

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 739
    Points : 31 068
    Points
    31 068
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adrien1 Voir le message
    oui mais je me suis fait ma libbrairie libmySocket.a et c'est avec ca que j'ai travaille

    elle contient : fonctionPartagee.o socketSer.o socketCli.o
    Il ne faut pas confondre librairie et include.
    Une librairie, c'est un fichier qui contient le code des diverses fonctions. Quand tu appelles la fonction, le programme (qui a été compilé avec la librairie) sait où aller se brancher pour exécuter la fonction.
    Si la librairie est statique, elle a été entièrement recopiée dans l'exécutable lors de la compilation et peut donc même être supprimée sans que ça gêne le fonctionnement de l'exécutable.
    Si la librairie est dynamique, alors elle est appelée par l'exécutable quand il en a besoin et doit donc toujours être à sa disposition.

    Le header associé à la librairie c'est simplement un fichier qui contient le prototype des fonctions qui sont dans la librairie (car tu n'ignores certainement pas que toute fonction qui est susceptible d'être appelée doit d'abord être prototypée avant son premier appel). Ca t'évite d'avoir à les prototyper toi-même (surtout si la librairie contient 5000 fonctions)...

    Donc t'as créé une librairie => ok. Maintenant, tu veux l'utiliser => tu dois include le header lors de la compilation. Et les emplacements de la librairie et du header n'ont aucune importance (d'ailleurs, la librairie standard est dans "/usr/lib" et les headers sont dans "/usr/include" et cela ne gêne personne...)

Discussions similaires

  1. librairie statique
    Par Mokhtar BEN MESSAOUD dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 29/01/2006, 00h00
  2. [C++]Créer des librairies statiques
    Par aiolia_aiolos dans le forum MFC
    Réponses: 3
    Dernier message: 04/01/2006, 13h05
  3. Réponses: 5
    Dernier message: 22/12/2005, 18h31
  4. Réponses: 2
    Dernier message: 19/08/2005, 17h02
  5. librairie statique/dynamique
    Par trop_wizz dans le forum MFC
    Réponses: 4
    Dernier message: 11/04/2005, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo