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] Séparer fichiers objets des fichiers sources


Sujet :

Systèmes de compilation

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut [MAKEFILE] Séparer fichiers objets des fichiers sources
    Bonjour,

    Suivant l'arborescence suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ~/MonProjet
          ¦
          /include
          ¦
          /objects
          ¦
          /src
    Et le Makefile suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    INCLUDE_PATH = include/
    SRC_PATH = src/
    OBJECTS_PATH = objects/
     
    CC = g++
    CCFLAGS = -Wall -ansi -O3  -fPIC
     
    SRCS = $(shell find $(SRC_PATH) -name "*.cpp" -print)
    INCLUDES = $(shell find $(INCLUDE_PATH) -name "*.h" -print)
    OBJS = $(SRCS:.cpp=.o)
    ...
    Je n'arrive pas à faire en sorte que les fichiers .o soient créer dans leur repertoire dédié objects/. Car bien que tout fonctionne bien, les .o sont crées dans src/.

    Merci de votre aide.

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    OBJS := $(SRCS:%.c=objects/%.o)
     
    ...
    all: objects $(TARGETS)
     
    objects: 
      -mkdir objects
     
    objects/%.o: %c
      $(CC) $(CFLAGS) -o $@ -c $<
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Ca ne marche pas.

    J'ai oublié de préciser que le main.cpp se trouve au même niveau que les répertoires:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ~/MonProjet
          ¦
          /include
          ¦
          /objects
          ¦
          /src
          ¦
          makefile
          ¦
          main.cpp
    Et voici mon makefile en entier:
    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
     
    TARGET = main
    EXEC = main
     
    INCLUDE_PATH = include/
    SRC_PATH = src/
    OBJECTS_PATH = objects/
    LIBS =
     
    CC = g++
    CCFLAGS = -Wall -ansi -O3  -fPIC
     
    SRCS = $(shell find $(SRC_PATH) -name "*.cpp" -print)
    INCLUDES = $(shell find $(INCLUDE_PATH) -name "*.h" -print)
    OBJS = $(SRCS:.cpp=.o)
     
     
    .SUFFIXES : .cpp .o
     
    all : $(TARGET).o $(OBJS)
    	$(CC) -o $(EXEC) $(TARGET).o $(OBJS)
     
    .cpp.o :
    	@echo "Building $@"
    	$(CC) $(CCFLAGS) -o $@ -c $< -I$(INCLUDE_PATH)
     
    .PHONY :  clean
     
    clean :
    #	@echo "Cleaning all"
    	rm -f $(OBJS) $(TARGET).o $(EXEC)

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    Petite correction la solution donnée est pour des fichiers c (.c)
    Alors que pour le c++ c'est cpp

    Citation Envoyé par Emmanuel Deloget Voir le message
    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    OBJS := $(SRCS:%.c=objects/%.o)
     
    ...
    all: objects $(TARGETS)
     
    objects: 
      -mkdir objects
     
    objects/%.o: %c
      $(CC) $(CFLAGS) -o $@ -c $<
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    OBJS := $(SRCS:%.cpp=objects/%.o)
     
    ...
    all: objects $(TARGETS)
     
    objects: 
      -mkdir objects
     
    objects/%.o: %c
      $(CC) $(CFLAGS) -o $@ -c $<
    Bonne journée

  5. #5
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Oui j'avais corrigé en cpp, mais ça ne fonctionne pas.
    Pour un fichier ClasseA.cpp par exemple, à la compilation il cherche à produire le fichier objet "src/ClasseAobjects/.o" au lieu de "objects/ClasseA.o".

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    De souvenir je faisait ça perso

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    OBJ=$(SRC:.cpp=.o)
     
    all:$(OBJ)
    $(CC) -o $(NAME) $(OBJ)
    un truc du style

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par LinuxUser Voir le message
    Oui j'avais corrigé en cpp, mais ça ne fonctionne pas.
    Pour un fichier ClasseA.cpp par exemple, à la compilation il cherche à produire le fichier objet "src/ClasseAobjects/.o" au lieu de "objects/ClasseA.o".
    meh ?

    Tu utilises quelle version de make ? A priori, c'est gmake, auquel cas c'est censé marcher. Si les fichiers cpp sont dans des répertoires, alors il peut y avoir quelques problèmes (il faut créer les répertoires cibles avant la compilation des fichiers).

    Je testerai demain, histoire de voir si je n'ai rien oublié de facheux. Mais la substitution doit marcher - c'est assez basique comme transformation.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  8. #8
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Il s'agit de GNU Make 3.81, par contre il est indiqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ce logiciel est construit pour i686-pc-linux-gnu
    Faut-il comprendre par là qu'il est censé être utilisé avec un OS 32 bits? Moi je suis en 64.

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    De tête, les ix86 sont des 32 bits, à l'opposé des x86_64.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    En espérant répondre à la question.


    P6_(microarchitecture)


    Cherche la bonne architecture de ton PC et télécharge la bonne version de linux.

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    J'ai un peu de mal à comprendre comment vous êtes passé d'un make qui fonctionne, à réinstaller l'OS ou à vérifier l'architecture ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Je n'ai pas reinstaller d'OS, j'essaie de comprendre et de trouver pourquoi mon makefile (qui compile et fonctionne) ne fait exactement ce que je veux, à savoir mettre les fichiers objets *.o dans le répertoire objects/ au lieu de src/.

  13. #13
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par LinuxUser Voir le message
    Je n'ai pas reinstaller d'OS, j'essaie de comprendre et de trouver pourquoi mon makefile (qui compile et fonctionne) ne fait exactement ce que je veux, à savoir mettre les fichiers objets *.o dans le répertoire objects/ au lieu de src/.
    Les répertoires font partie des noms de fichiers, tu as l'air de vouloir t'affranchir de cette contrainte (on peut le faire avec vpath, mais ça nécessite de partir de l'idée que tout est généré dans le répertoire courant).

    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
    TARGET = main
    EXEC = main
     
    INCLUDE_PATH = include/
    SRC_PATH = src/
    OBJECTS_PATH = objects/
    LIBS =
    CC = g++
    CCFLAGS = -Wall -ansi -O3  -fPIC
     
    SRCS := $(shell find $(SRC_PATH) -name "*.cpp" -print)
    OBJS := $(SRCS:$(SRC_PATH)%.cpp=$(OBJECTS_PATH)%.o)
     
    .SUFFIXES : .cpp .o
     
    all : $(OBJECTS_PATH)$(TARGET).o $(OBJS)
    	$(CC) -o $(EXEC) $^
     
    $(OBJECTS_PATH)%.o : $(SRC_PATH)%.cpp
    	echo "Building $@"
    	$(CC) $(CCFLAGS) -o $@ -c $< -I$(INCLUDE_PATH)
     
    $(OBJECTS_PATH)%.o : %.cpp
    	echo "Building $@"
    	$(CC) $(CCFLAGS) -o $@ -c $< -I$(INCLUDE_PATH)
     
    .PHONY :  clean
     
    clean :
    	@echo "Cleaning all"
    	rm -f $(OBJS) $(TARGET).o $(EXEC)
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  14. #14
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    J'ai un peu de mal à comprendre comment vous êtes passé d'un make qui fonctionne, à réinstaller l'OS ou à vérifier l'architecture ...
    C'est simplement l'attitude courante sur les forums, "je n'ai pas compris quel était le problème, mais j'ai remarqué quelque chose d'autre que je ne comprends pas non plus et que je ne sais même pas si elle est en rapport, mais je diverge la discussion là-dessus".

    Un noyau Linux 64 bits est parfaitement capable de faire tourner des exécutables 32 bits si toutes les libs dynamiques nécessaires sont correctement installées. S'il y avait eu un problème de cet ordre, les symptômes auraient été bien différents.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. [vbs] rassembler des fichiers txt en fichiers Xls
    Par Empty_body dans le forum VBScript
    Réponses: 10
    Dernier message: 27/02/2006, 17h14
  2. Les logiciels pour compiler des fichiers HTML en fichiers d’
    Par Edoxituz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 23/02/2006, 17h02
  3. Réponses: 1
    Dernier message: 27/11/2005, 14h30
  4. lister des fichiers selon des critères
    Par Corben dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 18/10/2005, 16h52
  5. Chemin d'accès des fichiers dans des sous rep
    Par Le Veilleur dans le forum C++Builder
    Réponses: 4
    Dernier message: 17/11/2004, 14h37

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