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

Autres éditeurs Discussion :

Générer les fichiers .o dans un autre répertoire ?


Sujet :

Autres éditeurs

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut Générer les fichiers .o dans un autre répertoire ?
    Bonjour,

    Je voudrais savoir s'il est possible de faire en sorte
    qu'un makefile génère les fichiers objets dans un sous répertoire
    (un répertoire 'obj' par ex) de façon a avoir moins de fichiers dans
    le répertoire courant.
    Si oui, voici le makefile de base que j'utilise.
    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
     
    SRC = main.c
    OBJ = $(SRC:.c=.o)
    EXE = main.exe
     
    CC = gcc
    CFLAGS = -Wall -Os
    LFLAGS = -mconsole
     
    %.o: %.c *.h
    	$(CC) $(CFLAGS) -c $(<) -o $(@)
     
    all: compile
     
    compile: $(EXE)
     
    $(EXE): $(OBJ)
    	$(CC) $(OBJ) $(LFLAGS) -o $(EXE)
     
    strip: $(EXE)
    	strip --strip-all $(EXE)
     
     
    clean:
    	del $(OBJ)
    	del $(EXE)
    Est ce que quelqu'un pourrait me montrer où effectuer les changements ?

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    J'avais proposé ceci à quelqu'un ayant le même problème que toi avant mais ma façon de déterminer les objets à générer est maladroite. Il y aurait peut-être moyen de faire mieux avec le vpath. Regarde toujours.
    http://www.developpez.net/forums/sho...d.php?t=421487

  3. #3
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Merci pour ta réponse
    J'ai essayé d'adapter ton makefile au mien mais ça ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    PATH = obj/
     
    ...
     
    $(PATH)%.o: %.c *.h
    	$(CC) $(CFLAGS) -c $(<) -o $(@)
    j'ai des erreurs à la compilation du genre 'gcc commande introuvable'.
    C'est vrai que je ne suis pas un pro du makefile loin de là

    Quelqu'un aurait une idée ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Installe gcc... Ca ne dépend pas du Makefile.

  5. #5
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Je compile avec Mingw, (gcc pour Windows), il doit donc certainement falloir
    faire quelque chose au niveau du makefile non ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Soit tu installes MSYS, ce qui te simplifiera la vie.
    Soit tu spécifies CC = C:\Mingw\gcc (ou tu ajoutes C:\Mingw dans le path) en espérant que ça suffise. Ce n'est pas forcément C:\Mingw, à toi d'adapter.

  7. #7
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Bon, je comprends rien à cette logique de dingue.
    Voici pas à pas les essaies que j'ai effectué.

    1)Le truc giga basique. Un simple fichier .cpp et un makefile réduit au minimum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DIR_OBJ=obj/
     
    all: hello
     
    hello: main.o
    	g++ -o hello $(DIR_OBJ)main.o
     
    main.o: main.cpp
    	g++ -o $(DIR_OBJ)main.o -c main.cpp -W -Wall
    Là ça fonctionne. Le fichier objet main.o est bien créé dans le sous répertoire obj
    et l'executable dans le répertoire courant.

    2) Ensuite j'ai voulu adapter tout ça à quelque chose de plus complexe.
    j'ai pris exemple sur le tuto makefile de développez.com
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CC=g++
    CFLAGS=-W -Wall
    LDFLAGS=
    EXEC=hello
     
    all: $(EXEC)
     
    hello: hello.o main.o
    	$(CC) -o $@ $^ $(LDFLAGS)
     
    %.o: %.cpp
    	$(CC) -o $@ -c $< $(CFLAGS)
    Ce makefile compile parfaitement, mais tous les fichiers (*.o *.exe) sont créés
    dans le répertoire courant.
    Maintenant impossible de faire générer les fichiers *.o dans le sous répertoire obj. J'ai essayé dans tous les sens je n'ai que des erreurs. Le seul truc qui a marché c'est ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CC=g++
    CFLAGS=-W -Wall
    LDFLAGS=
    DIR_OBJ=obj/
    EXEC=hello
     
    all: $(EXEC)
     
    hello: hello.o main.o
    	$(CC) -o $(DIR_OBJ)$@ $^ $(LDFLAGS)
     
    %.o: %.cpp
    	$(CC) -o $@ -c $< $(CFLAGS)
    mais, ironie, c'est l'exécutable qui est généré dans le sous répertoire obj et les
    fichiers objet qui sont générés dans le répertoire courant.
    Est ce que quelqu'un pourrait me dire pourquoi et me montrer la syntaxe exacte ?

    Merci d'avance

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    J'espère que ceci t'aidera. Comme je l'ai déjà dit, je ne suis pas convaincu que ce soit la meilleure manière de faire, en particulier le $(DIR_OBJ)%.o. Il y a sûrement moyen de faire mieux avec la variable vpath.
    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
     
    CC=g++
    CFLAGS=-W -Wall
    LDFLAGS=
    DIR_OBJ=obj/
    EXEC=hello
    OBJS=hello.o main.o
    DIR_OBJS=$(addprefix $(DIR_OBJ), $(OBJS))
     
    all: $(EXEC)
     
    hello: $(DIR_OBJS)
    	$(CC) -o $@ $^ $(LDFLAGS)
     
    $(DIR_OBJ)%.o: %.cpp
    	$(CC) -o $@ -c $< $(CFLAGS)
    $@ correspond à la cible. C'était donc normal que ton exécutable soit généré dans obj/. Tu faisais la commande suivante g++ -o obj/hello ...

  9. #9
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Je te remercie beaucoup pour ton aide, ça marche
    $@ correspond à la cible. C'était donc normal que ton exécutable soit généré dans obj/. Tu faisais la commande suivante g++ -o obj/hello ...
    oui effectivement, en plus c'est écris dans le tuto
    Comme je l'ai déjà dit, je ne suis pas convaincu que ce soit la meilleure manière de faire, en particulier le $(DIR_OBJ)%.o. Il y a sûrement moyen de faire mieux avec la variable vpath.
    Je vais creuser un peu plus le sujet en profondeur histoire d'en comprendre mieux les principes et de créer un makefile plus "correcte".

    Merci encore.

  10. #10
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Juste un dernier truc (aprés j'arrête, promis )
    Lorsque je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OBJS = hello.o main.o
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OBJS = $(SRC:.cpp=.o)
    pour créer automatiquement la liste des fichier.o
    ça ne fonctionne plus, j'ai le message:
    no rule to make target 'obj/hello.h', needed by 'hello'.
    Je n'arrive pas à comprendre comment fonctionne cette macro.
    Comment génère-t-elle la liste des fichiers .o à créer ?

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    La modification paraît juste. Maintenant, reste à voir le contenu de la variable SRC. Il ne doit y avoir que des .cpp (pas de .h) dans cette variable.
    Pour lister les dépendances, quelques lignes à la fin du Makefile suffisent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    hello.o : hello.cpp hello.h
    main.o : main.cpp hello.h
    makedepend permet de résoudre automatiquement le problème.

    La macro en question remplace toutes les occurences (en fin de mot je crois) de .cpp par .o. Donc, le fichier hello.h dans SRC restera hello.h dans OBJS.

  12. #12
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Il ne doit y avoir que des .cpp (pas de .h) dans cette variable.
    Ah ok, je comprend mieux pourquoi ça marchait pas (j'avais mis hello.h dans la variable SRC).
    La macro en question remplace toutes les occurences (en fin de mot je crois) de .cpp par .o. Donc, le fichier hello.h dans SRC restera hello.h dans OBJS.
    Et oui.... logique !
    makedepend permet de résoudre automatiquement le problème.
    Effectivement, voici la nouvelle version de mon makefile:
    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
     
    CC=g++
    CFLAGS=-W -Wall
    LDFLAGS=
    SRC = main.cpp hello.cpp 
    DIR_OBJ=obj/
    EXEC=hello
    OBJS=$(SRC:.cpp=.o)
    DIR_OBJS=$(addprefix $(DIR_OBJ), $(OBJS))
     
    all: $(EXEC)
     
    hello: $(DIR_OBJS)
    	$(CC) -o $@ $^ $(LDFLAGS)
     
    $(DIR_OBJ)%.o: %.cpp
    	$(CC) -o $@ -c $< $(CFLAGS)
     
    depend:
    	makedepend -- $(CFLAGS) -- $(SRC)
    Il semble bien fonctionner, (j'ai fais 3 compilations différentes et je n'ai eu aucun pb).
    J'espère juste que la façon dont il est construit est "à peu prés" correcte et ne créera
    pas de mauvaise surprise par la suite.

    Merci encore

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Points : 89
    Points
    89
    Par défaut
    Personnellement je fais ça :
    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
    CXX = g++
    CXXFLAGS = -W -Wall -ansi -pedantic
    LDFLAGS = 
    EXEC = hello
    OBJDIR = obj
    BINDIR = bin
    SRC = $(wildcard src/*.cpp)
    OBJ = $(SRC:.cpp=.o)
    OBJ := $(addprefix $(OBJDIR)/, $(OBJ))
     
    all: $(EXEC)
     
    hello: $(OBJ)
    	@mkdir -p $(BINDIR)
    	@$(CXX) -o $(BINDIR)/$@ $^ $(LDFLAGS)
     
    $(OBJDIR)/%.o: %.cpp
    	@$(CXX) -o $@ -c $< $(CXXFLAGS)
     
    .PHONY: clean mrproper
     
    clean:
    	@rm -rf $(OBJDIR)/*.o
     
    mrproper: clean
    	@rm -f $(BINDIR)/$(EXEC)
    Ça va chercher les sources dans src/, écrit les .o dans obj/ et le binaire dans bin/.
    Par contre, pour que ce soit récursif, il faut ajouter les chemins manuellement dans SRC, et créer l'arborescence dans obj/.

Discussions similaires

  1. [AC-2007] déplacer des fichiers txt dans un autre répertoire
    Par tibofo dans le forum VBA Access
    Réponses: 2
    Dernier message: 10/01/2010, 10h40
  2. Réponses: 3
    Dernier message: 31/03/2009, 08h58
  3. vérifier un fichier présent dans un autre répertoire
    Par palcoquoz dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 18/06/2007, 10h02
  4. Réponses: 3
    Dernier message: 12/04/2006, 20h44
  5. Déplacer un fichier dans un autre répertoire
    Par t_om84 dans le forum Général Python
    Réponses: 2
    Dernier message: 16/05/2005, 09h36

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