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

C Discussion :

Problème de link avec ma librairie statique


Sujet :

C

  1. #1
    Membre habitué Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 133
    Points
    133
    Par défaut Problème de link avec ma librairie statique
    Bonjour à tous,

    J'ai écrit une petite librairie qui me sert à gérer mes allocations mémoire en C.
    À l'aide de ce site, j'ai tweaké mon makefile pour créer une librairie statique (libmm.a) que je voudrais linker avec un fichier de test à côté.

    (pour les curieux, le code est là, en version ultra alpha: http://github.com/Gui13/memory-manager )

    Les joueurs sont tous dans le même répertoire:
    - le fichier libmm.a qui contient les fichiers objet de ma lib
    - le fichier memory_manager.h qui déclare les fonctions
    - le fichier prout.c qui contient du code "de base" pour tester mon gestionnaire de mémoire.

    Le problème est le suivant:
    quand je lance un "$ gcc -static -o stat -L. -lmemo -W -Wall prout.c" voilà ce qu'il me sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    C:/Users/GUILLA~1/AppData/Local/Temp/cciLKBGQ.o:prout.c:(.text+0x51): référence indéfinie vers " mm_calloc "
    C:/Users/GUILLA~1/AppData/Local/Temp/cciLKBGQ.o:prout.c:(.text+0x6c): référence indéfinie vers " mm_stats "
    collect2: ld returned 1 exit status
    Je comprends bien que le gars il me trouve pas mes symboles pour mm_calloc et mm_stats.
    Pourtant un "nm libmm.a" révèle:
    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
    48
    $ nm libmm.a
     
    bstree.o:
    00000000 b .bss
    00000000 d .data
    00000000 r .rdata
    00000000 N .stab
    00000000 N .stabstr
    00000000 t .text
             U _abort
    00000000 t _alloc_bstree_node
    000000c8 T _bstree_add
    000002b2 T _bstree_delete
    00000194 T _bstree_free
    00000025 t _bstree_insert
    00000265 T _bstree_search
    000001ec t _bstree_search_recursive
    00000147 T _bstree_walk
             U _free
             U _malloc
             U _printf
     
    memory_manager.o:
    00000000 b .bss
    00000000 d .data
    00000000 r .rdata
    00000000 N .stab
    00000000 N .stabstr
    00000000 t .text
             U _bstree_add
             U _bstree_delete
             U _bstree_walk
             U _calloc
             U _free
             U _malloc
             U _memcpy
    000001ed T _mm_calloc
    00000000 t _mm_compare
    000002fe T _mm_free
    0000005a t _mm_free_struct
    000000e7 T _mm_malloc
    00000010 b _mm_nbofallocs
    0000008e t _mm_print_func
    00000000 b _mm_root
    00000020 b _mm_sizeofallocs
    00000340 T _mm_stats
             U _printf
             U _strlen
    Nieu?

    Quelqun a réponse à ça?

    Je précise que c'est du pur C, pas de g++ involved..

  2. #2
    Membre habitué Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 133
    Points
    133
    Par défaut
    Code de prout.c:
    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
    #include <stdlib.h>
    #include <string.h>
     
    #include "memory_manager.h"
     
    int main()
    {
    	char *prout= NULL;
     
    	prout = (char *)MM_CALLOC(50,sizeof(char));
     
    	strcpy(prout, "Niark");
     
    	mm_stats();
     
    	return 0;
    }
    Le code de memory_manager.h:
    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
    #ifndef _MEMORY_MANAGER_H
    #define _MEMORY_MANAGER_H
     
    #include <stdlib.h>
     
    #ifdef __cplusplus
     extern "C" {
    #endif 
     
    typedef struct _memory_allocation memory_allocation;
     
    #define MM_MALLOC(a) mm_malloc((a),__FILE__,__LINE__)
    #define MM_CALLOC(a,b) mm_calloc((a),(b),__FILE__,__LINE__)
    #define MM_FREE(a) mm_free((a))
     
     
     
    extern void *mm_malloc(size_t sz, char *file, int line);
    extern void *mm_calloc(size_t times, size_t sz, char *file, int line);
    extern void mm_free( void *pt);
    extern void mm_stats(void);
     
    #ifdef __cplusplus
     }
    #endif
     
    #endif

  3. #3
    Membre habitué Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 133
    Points
    133
    Par défaut
    OHHHH put***...

    http://www.network-theory.co.uk/docs...cintro_18.html

    Dur dur, j'ai cherché 2 heures sur google pour trouver ça..

    Pour ceux qui ne lisent pas l'anglais: l'ordre des arguments de gcc est TRÈS important: il faut mettre les fichiers qui utilisent la lib AVANT de mentionner la lib.

    Ex:
    gcc -static -o stat -L. -lmm -W -Wall prout.c <--- marche pas..
    gcc -static -o stat prout.c -L. -lmm -W -Wall <--- marche


    Dingo...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec une librairie statique
    Par flo_k dans le forum C
    Réponses: 2
    Dernier message: 21/09/2009, 21h50
  2. Problème de lien avec une bibliothèque statique
    Par streetpc dans le forum C++/CLI
    Réponses: 2
    Dernier message: 28/10/2006, 17h38
  3. [Code::Blocks] problème de link avec DevIL
    Par theidiot dans le forum DevIL
    Réponses: 4
    Dernier message: 01/10/2006, 18h26
  4. Problème de linkage avec la librairie DevIl
    Par Drannor dans le forum DevIL
    Réponses: 1
    Dernier message: 18/01/2006, 23h05
  5. Problème de link avec Borland C++ 5.5
    Par gelam dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/11/2003, 16h45

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