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

Systèmes de compilation Discussion :

Makefile : fichiers sources dans differents dossiers ?


Sujet :

Systèmes de compilation

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 17
    Points : 18
    Points
    18
    Par défaut Makefile : fichiers sources dans differents dossiers ?
    Bonjour a tous,

    Je suis confronte a un probleme, qui je pense, doit pouvoir se resoudre aisement. Malheureusement je suis pas tres fort en Makefile

    Voila mon probleme : je dispose de plusieurs fichiers sources .c, dans differents dossiers.

    Mettons :

    - ./ (racine ou se trouve mon Makefile)
    - ./plop/plop1.c
    - ./plop/plop2.c
    - ./toto/titi.c

    Mon makefile est donc cense choper les fichiers que je lui indique en source dans ces differents sous dossiers (je compile avec gcc), me generer des fichiers .o (apres compilation des fichiers). Malheureusement, lors du make, il me place les fichiers .o a la racine du dossier (./), et apres il ne les trouve pas pour generer mon executable (il les cherches dans les sous dossiers).

    Pour faire plus clair, voila mon Makefile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    NAME    =       executable
    SRC     =       plop/plop1.c \
                        plop/plop2.c \
                        toto/titi.c
    OBJ     =       $(SRC:.c=.o)
     
    $(NAME) :       $(OBJ)
                    gcc -o $(NAME) $(OBJ)
    all     :       $(NAME)
    Je me retrouve donc avec dans le dossier ./ ces fichiers .o :
    - ./plop1.o
    - ./plop2.o
    - ./titi.o

    Jusque la normal sauf que la compilation va planter, ne trouvant pas les .o dans les sous-dossiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    gcc: funcs/base1.o: No such file or directory
    gcc: plop/plop1.o: No such file or directory
    gcc: plop/plop2.o: No such file or directory
    gcc: toto/titi.o: No such file or directory
    gcc: no input files
    *** Error code 1
     
    Stop.
    make: stopped in ./...
    Bref, avant j'utilisais une commande "mv" dans le Makefile, lui disant de deplacer fichier par fichier .o dans leur repertoire respectifs. Mais cest crade et surtout tres lourd a utiliser/mettre a jour.

    Il y aurait-il une solution plus simple ?
    J'ai cherche du cote de man make et make mkdep, mais sans beaucoup de succes. Si quelqu'un aurait des astuces

  2. #2
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Salut,

    Euh, je suis pas un expert en makefile mais je vois pas ta ligne qui cree les .o . Tu donnes juste la regle qui genere l'executable, pas la/les regle(s) qui genere(nt) les .o (avec -c)

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    regarde dans les messages précédent sur le forum C.
    J'ai donné la réponse en mettant mon makefile, il est complet et compile les fichiers sources qui sont dans un dossier Src avec les header qui sont dans Include et met les .o dans un fichier objet.

    Sinon tu as un super tutoriel sur le forum :
    http://gl.developpez.com/tutoriel/outil/makefile/


    Si tu ne retrouves pas mon sujet, dit le moi, je te le donnerai.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 81
    Points
    81
    Par défaut
    Salut,
    Essaye de rajouter ca dans ton makefile,

    .c.o:
    gcc -c $< -o $(<:.c=.o)

    Ou tu veux ca n'a pas d'importance.

  5. #5
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    je n'ai pas retrouvé mon makefile dans le forum, alors le voici :
    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
     
    CC=gcc
    CPP=g++
     
     
    # Les différents répertoires contenant respectivement les fichiers : Sources *.c, Headers *.h, Objets *.o, l'exécutable
    SRCDIR=Src
    HEADDIR=Include
    LIBDIR=Objet
    BINDIR=Bin
     
     
    # Les différentes options de compilations, soyons strictes !
    CFLAGS= -I$(HEADDIR) -g -Wall -pedantic -Os
    # Les différents FrameWorks et bibliothèques pour le linkage
    GLLIBS = -ltiff -framework OPENGL -framework GLUT -framework GLUI -lobjc -lstdc++ -lm
     
    # L'exécutable
    BIN=MonExecutable
     
    # Où trouver les différents sources *.c qu'il faudra compiler pour créer les objets correspondants
    SRC= $(wildcard $(SRCDIR)/*.c)
    OBJ= $(SRC:$(SRCDIR)/%.c=$(LIBDIR)/%.o)
     
    # Où trouver les différents sources *.cpp qu'il faudra compiler pour créer les objets correspondants
    SRCPP= $(wildcard $(SRCDIR)/*.cpp)
    OBJCPP= $(SRCPP:$(SRCDIR)/%.cpp=$(LIBDIR)/%.o)
     
    all: $(BIN)
     
    #Création de l'exécutable
    MonExecutable: $(OBJ) $(OBJCPP)
    	$(CC) -o $(BINDIR)/$@ $^ $(CFLAGS) $(GLLIBS)
     
    # Création des différents *.o à partir des *.c
    $(LIBDIR)/%.o: $(SRCDIR)/%.c $(HEADDIR)/%.h 
    	$(CC) -o $@ -c $< $(CFLAGS)
     
    # Création des différents *.o à partir des *.cpp
    $(LIBDIR)/%.o: $(SRCDIR)/%.cpp $(HEADDIR)/%.h
    	$(CPP) -o $@ -c $< $(CFLAGS)
     
    # Nettoyage des objets => Tout sera recompiler !
    clean:
    	rm $(LIBDIR)/*.o
     
    # Nettoyage complet => clean + effacement du l'exécutable
    Clean: clean
    	rm $(BINDIR)/*
    Ce makefile permet de compiler des fichiers c et cpp dans un meme soft.
    Si tu le souhaites, retire les lignes relatives au cpp.

    Bon courage
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

Discussions similaires

  1. Réponses: 21
    Dernier message: 27/04/2013, 17h27
  2. Makefile : sources dans plusieurs dossiers
    Par ParkerL31884 dans le forum Fortran
    Réponses: 1
    Dernier message: 15/10/2010, 10h19
  3. Réponses: 0
    Dernier message: 02/12/2008, 17h07
  4. recencer fichier excel dans meme dossier
    Par attavus dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/07/2006, 11h38

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