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 :

Erreur de compilation si j'utilise mon makefile


Sujet :

C

  1. #1
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut Erreur de compilation si j'utilise mon makefile
    Bonjour

    J'ai un code avec une vingtaine de fichiers et fonctions. Si je le compile en faisant un bête et méchant :

    gcc -lm -I../include/ -o exec *.c

    je n'est aucun message d'erreur. Par contre l'utilisation de ce makefile produit des erreurs après l'édition de liens.

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    # -------------------------------------------------------------------
    #  options modifiables
    # -------------------------------------------------------------------
     
    # Nom de l'executable :
    EXECUTABLE = cargol
     
    # Choix du compilateur :
    COMPILATEUR = gcc
     
    # Options de compilations :
    COPTIONS = -O3 -Wall -Wextra 
    LOPTIONS = -lm 
     
     
    # -------------------------------------------------------------------
    #  Emplacement des sources et des objets
    # -------------------------------------------------------------------
     
    # Dossier racine du code :
    CODE := $(shell pwd)
     
    # Adresse des sources, des objets et des includes :
    INCDIR = $(CODE)/include
    SRCDIR = $(CODE)/src
    OBJDIR = $(CODE)/obj
    EXISTE := $(wildcard $(OBJDIR))
     
    # Liste des fichiers sources :
    SRC = $(wildcard $(SRCDIR)/*.c)
    #SRC = $(foreach nom, $(SRCDIR), $(wildcard $(nom)/*.c))
     
    # Liste des fichiers objets :
    NOM = $(basename $(notdir $(SRC)))
    OBJ = $(addprefix $(OBJDIR)/, $(addsuffix .o, $(NOM)))
     
     
    # -------------------------------------------------------------------
    #  compilation
    # -------------------------------------------------------------------
     
    # regle par defaut
    defaut: dev
     
    # regle edition de liens
    install: dir $(OBJ) 
    	$(COMPILATEUR) -o $(EXECUTABLE) $(LOPTIONS) $(OBJ)
     
    # regle edition de liens dans le cas dev
    dev: dir $(OBJ) 
    	$(COMPILATEUR) -o $(EXECUTABLE)_dev $(LOPTIONS) $(OBJ)
     
    # regle de compilation des sources
    $(OBJ): $(SRC)
    	$(COMPILATEUR) -c $(COPTIONS) -I$(INCDIR) -o $@ $<
     
    # $@ = nom de la regle
    # $< = nom de la cible
     
    # -------------------------------------------------------------------
    #  regles suplementaires
    # -------------------------------------------------------------------
     
    .PHONY: clean help dir purge
     
    # creation du dossier obj si besoin :
    ifeq ($(strip $(EXISTE)), )
    dir: 
    	mkdir $(OBJDIR)
    else
    dir: 
    endif 
     
    # pour effacer tous les objet :
    clean:
    	rm -rf $(OBJDIR)
     
    # pour effacer tous les objet et les executables :
    purge:
    	rm -rf $(OBJDIR) $(EXECUTABLE) $(EXECUTABLE)_dev
     
    # aide :
    help:
    	@echo
    	@echo " Programme Cargol"
    	@echo
    	@echo "--------------------------------------------------------------------------"
    	@echo " Options disponibles"
    	@echo
    	@echo " install : compilation et creation de l'executable cargol"
    	@echo " dev     : compilation et creation de l'executable cargol_dev (defaut)"
    	@echo " clean   : effacement des fichiers objets"
    	@echo " purge   : effacement des fichiers objets et des executables"
    	@echo "--------------------------------------------------------------------------"
    	@echo
    Dans mon code allocation.c qui contient la fonction allocation() est le premier fichier par ordre alphabétique. Quand je compile avec le makefile il me dit pour toutes mes fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /programme/cargol/comp/obj/commande.o: In function `allocation':
    allocation.c:(.text+0x0): multiple definition of `allocation'
    /programme/cargol/comp/obj/allocation.o:allocation.c:(.text+0x0): first defined here
    /programme/cargol/comp/obj/defaut.o: In function `allocation':
    allocation.c:(.text+0x0): multiple definition of `allocation'
    /programme/cargol/comp/obj/allocation.o:allocation.c:(.text+0x0): first defined here
    /programme/cargol/comp/obj/dynamique.o: In function `allocation':
    allocation.c:(.text+0x0): multiple definition of `allocation'
    Puis encore pour toutes mes fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /programme/cargol/comp/obj/allocation.o: In function `allocation':
    allocation.c:(.text+0x2f): undefined reference to `nat'
    allocation.c:(.text+0x36): undefined reference to `nomfonction'
    allocation.c:(.text+0x42): undefined reference to `nomfonction'
    allocation.c:(.text+0x49): undefined reference to `nomfonction'
    allocation.c:(.text+0x55): undefined reference to `nat'
    allocation.c:(.text+0x61): undefined reference to `frcx'
    allocation.c:(.text+0x6d): undefined reference to `nat'
    allocation.c:(.text+0x79): undefined reference to `frcy'
    allocation.c:(.text+0x85): undefined reference to `nat'
    ....
    toutes les variables de la fonction allocation()
    Si vous voulais je peux fournir le code et le makefile par un zip.

    Merci d'avance

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    • Y a-t-il une inclusion de fichier .c qui traine (genre #include allocation.c) ?
    • Y a-t-il une garde dans les fichier header ? (#ifndef ALLOC_H #define ALLOC_H ... #endif)

  3. #3
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Non rien de tout ça malheureusement ...

    J'ai mis le code en pièce jointe.
    Fichiers attachés Fichiers attachés

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    J'ai trouvé : Si on lit se qui se passe à la compilation, on voit :
    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
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/force_ene.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/free.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/init_DPDE.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/init_calcul.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/lecture_input.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/main.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/message_accueil.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/moyenne.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/nbre_aleatoire.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/periodic_cond.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/position.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/positionLNVT.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/positionNVE.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/print.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/read_configuration.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/start_configuration.o /src/allocation.c
    gcc -c -O3 -Wall -Wextra  -I/include -o /obj/start_vitesse.o /src/allocation.c
    ...
    Rien ne te choque ?

    Solution : remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # regle de compilation des sources
    $(OBJ): $(SRC)
    	$(COMPILATEUR) -c $(COPTIONS) -I$(INCDIR) -o $@ $<
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # regle de compilation des sources
    $(OBJDIR)/%.o: $(SRCDIR)/%.c
    	$(COMPILATEUR) -c $(COPTIONS) -I$(INCDIR) -o $@ $<

  5. #5
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut


    Merci beaucoup !!!!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/03/2014, 23h32
  2. [MinGW] enregistrer les erreurs de compilation via makefile ?
    Par runn2 dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 16/10/2007, 13h30
  3. Erreur de compilation C++ avec Makefile
    Par ChipsterJulien dans le forum C++
    Réponses: 2
    Dernier message: 27/08/2007, 19h27
  4. Erreur de compilation d'un fichier Makefile
    Par Doom dans le forum Linux
    Réponses: 3
    Dernier message: 13/07/2007, 14h46
  5. [VB6] erreur de compilation:utilisation incorrecte du mot clé New
    Par fouf_01 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 17/05/2006, 17h22

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