Partage
  • Partager sur Facebook
  • Partager sur Twitter

Makefile et Headers

Sujet résolu
    15 juin 2021 à 13:43:27

    NAME = ft_cat
    CC = gcc
    SRCS = $(wildcard $(SRC_PATH)/*.c)
    OBJ = $(SRCS:.C=.o)
    CFLAGS = -Wall -Wextra -Werror
    RM = rm -rf
    
    
    SRC_PATH = srcs
    
    HEAD_NAME = ft_cat.h
    HEAD_PATH = includes
    HEAD = $(addprefix $(HEAD_PATH)/, $(HEADNAME))
    
    
    
    all : $(NAME)
    
    $(NAME) : $(OBJ) $(HEAD)
    	$(CC) -o $@ $(OBJ) $(CFLAGS)
    
    %.o : %.c
    	$(CC) -o $@ -c $< $(CFLAGS) -I $(HEADERS)
    
    clean :
    	$(RM) $(OBJ)
    
    fclean : clean
    	$(RM) $(NAME)
    
    re : clean fclean
    
    .PHONY : all clean fclean re

    Bonjour ! J'ai un petit soucis de compréhension sur les headers dans les makefiles et je n'ai trouvé nul part la réponse sur internet du coup je viens demander de l'aide ... J'ai juste compris qu'il fallait ajouter -I et le dossier à inclure .

    En gros je dois faire un makefile qui compile mes fichiers en .c qui sont dans le dossier "srcs" et mon fichier "ft_cat.h" qui se trouve dans le dossier includes. 

    Voilà mon code, et je me demandais s'il était nécessaire dans la ligne "$(NAME) : $(OBJ) $(HEAD)" d'ajouter le $(HEAD)

    Dites moi ce que vous pensez de mon Makefile et s'il y a des modifications/ amélioration à faire :) ! Merci d'avance

    -
    Edité par NoéDormoy 15 juin 2021 à 13:44:05

    • Partager sur Facebook
    • Partager sur Twitter
      15 juin 2021 à 16:39:30

      Si tu peux utiliser autre chose que les Makefiles, se serait mieux. Écrire soi-même les relations .h/.c est contre-productif (les Makefile dispose quand même d'un moyen pour générer cette dépendance automatiquement).

      Sinon 3 problèmes:

      • Un exécutable n'a aucune raison de dépendre d'un .h, les .o dépendent des .c et .h. Ton utilisation de $(HEAD) est au mauvais endroit.
      • La variable HEADERS n'existe pas, tu voulais probablement mettre HEAD_PATH
      • C'est étrange de mettre un C majuscule dans le pattern de remplacement pour OBJ alors que tu utilises un wildcard de .c (donc minuscule)
      • Partager sur Facebook
      • Partager sur Twitter
        15 juin 2021 à 19:30:47

        jo_link_noir a écrit:

        Si tu peux utiliser autre chose que les Makefiles, se serait mieux. Écrire soi-même les relations .h/.c est contre-productif (les Makefile dispose quand même d'un moyen pour générer cette dépendance automatiquement).

        Sinon 3 problèmes:

        • Un exécutable n'a aucune raison de dépendre d'un .h, les .o dépendent des .c et .h. Ton utilisation de $(HEAD) est au mauvais endroit.
        • La variable HEADERS n'existe pas, tu voulais probablement mettre HEAD_PATH
        • C'est étrange de mettre un C majuscule dans le pattern de remplacement pour OBJ alors que tu utilises un wildcard de .c (donc minuscule)
        NAME = ft_cat
        CC = gcc
        SRCS = $(wildcard $(SRC_PATH)/*.c)
        OBJ = $(SRCS:.c=.o)
        CFLAGS = -Wall -Wextra -Werror
        RM = rm -rf
        
        
        SRC_PATH = srcs
        
        HEAD_NAME = ft_cat.h
        HEAD_PATH = includes
        HEAD = $(addprefix $(HEAD_PATH)/, $(HEADNAME))
        
        
        
        all : $(NAME)
        
        $(NAME) : $(OBJ)
        	$(CC) -o $@ $(OBJ) $(CFLAGS)
        
        %.o : %.c
        	$(CC) -o $@ -c $< $(CFLAGS) -I $(HEAD_PATH)
        
        clean :
        	$(RM) $(OBJ)
        
        fclean : clean
        	$(RM) $(NAME)



        Merci beaucoup c'était des fautes d'inattention ! Du coup je laisse comme ça, sans le $(HEAD) mon Makefile est bon ? :) 

        Malheureusement je suis obligé d'utiliser les Makefiles ;) !

        • Partager sur Facebook
        • Partager sur Twitter
          16 juin 2021 à 9:49:24

          C'est assez facile de faire une dépendance d'entête en faisant du pur make POSIX (compatible BSD et GNU). Il suffit d'utiliser -MMD avec gcc/clang.

          SRCS= foo.c bar.c quux.c
          OBJS= ${SRCS:.c=.o}
          DEPS= ${SRCS:.c=.d}
          
          all: main
          
          .c.o:
              ${CC} ${CFLAGS} -MMD -c $< -o $@
          
          # la magie ici
          -include ${DEPS}
          
          main: ${OBJS}
          
          clean:
              rm -f main ${OBJS} ${DEPS}
          
          .PHONY: all clean
          
          


          De ce fait, pendant la compilation le compilateur créé des fichiers .d compatible make qui contient les dépendance d'entête pour chaque fichier objet. Par conséquent make sait qui reconstruire si on modifie un entête.

          Pour les projets simples, pas toujours besoin de sortir l'artillerie lourde que sont CMake, meson, autotools et autre. Make a l'avantage d'être un composant POSIX (à condition de faire du POSIX make, préférable).

          -
          Edité par markand 16 juin 2021 à 10:22:39

          • Partager sur Facebook
          • Partager sur Twitter

          git is great because Linus did it, mercurial is better because he didn't.

            16 juin 2021 à 13:42:49

            markand a écrit:

            C'est assez facile de faire une dépendance d'entête en faisant du pur make POSIX (compatible BSD et GNU). Il suffit d'utiliser -MMD avec gcc/clang.

            SRCS= foo.c bar.c quux.c
            OBJS= ${SRCS:.c=.o}
            DEPS= ${SRCS:.c=.d}
            
            all: main
            
            .c.o:
                ${CC} ${CFLAGS} -MMD -c $< -o $@
            
            # la magie ici
            -include ${DEPS}
            
            main: ${OBJS}
            
            clean:
                rm -f main ${OBJS} ${DEPS}
            
            .PHONY: all clean
            
            


            De ce fait, pendant la compilation le compilateur créé des fichiers .d compatible make qui contient les dépendance d'entête pour chaque fichier objet. Par conséquent make sait qui reconstruire si on modifie un entête.

            Pour les projets simples, pas toujours besoin de sortir l'artillerie lourde que sont CMake, meson, autotools et autre. Make a l'avantage d'être un composant POSIX (à condition de faire du POSIX make, préférable).

            -
            Edité par markand il y a environ 3 heures


            Ah c'est pas mal ça !! Mais je ne pense pas que j'ai le droit de l'utiliser :/ donc je vais rester sur ce que j'ai envoyé en dernier message (en tout cas pour ce que je dois rendre, je vais regarder ce que tu m'as envoyé ;) ! )
            • Partager sur Facebook
            • Partager sur Twitter
              16 juin 2021 à 13:50:24

              Qu'est-ce que c'est cette raison de droit d'utiliser ?!

              Dans la vie on utilise ce qui est à disposition. Si on te demande de coder un snake graphique, sauf erreur de ma part tu vas utiliser des bibliothèques graphiques existantes pour ne pas tout réinventer.

              • Partager sur Facebook
              • Partager sur Twitter

              git is great because Linus did it, mercurial is better because he didn't.

                16 juin 2021 à 15:21:05

                markand a écrit:

                Qu'est-ce que c'est cette raison de droit d'utiliser ?!

                Dans la vie on utilise ce qui est à disposition. Si on te demande de coder un snake graphique, sauf erreur de ma part tu vas utiliser des bibliothèques graphiques existantes pour ne pas tout réinventer.


                Oui sauf que je vais passer 42 donc je n'ai pas le droit d'utiliser grand chose, par exemple en c on à pas le droit d'utiliser printf etc on doit tout refaire nous même ...
                • Partager sur Facebook
                • Partager sur Twitter
                  16 juin 2021 à 23:44:58

                  CNoéDormoy a écrit:

                  markand a écrit:

                  Qu'est-ce que c'est cette raison de droit d'utiliser ?!

                  Dans la vie on utilise ce qui est à disposition. Si on te demande de coder un snake graphique, sauf erreur de ma part tu vas utiliser des bibliothèques graphiques existantes pour ne pas tout réinventer.


                  Oui sauf que je vais passer 42 donc je n'ai pas le droit d'utiliser grand chose, par exemple en c on à pas le droit d'utiliser printf etc on doit tout refaire nous même ...


                  Pourquoi utiliser un makefile alors...On peut compiler sans.

                  C'est juste un métalangage, on peut très bien compiler son c sans make...

                  Bref peut être cette page pourra t'aider, parce que si tu ne peux pas utiliser du Makefil POSIX,  à vrai dire tu peux encore moins utiliser du Makefile pas POSIX, enfin ça parait être la vraie lignée.

                  Pour le printf tu peux le recoder par toi même à la limite si bon te semble. Même passer par de l'assembleur si ça augmente tes chances d'entrer en école, mais j'en doute un peu.

                  Après tout vouloir se passer de printf revient à se passer stdio.h...Un des includes les plus commun.

                  Donc tu lis le fichier stdio.h et tu te la recode à la main, façon à changer quelques paramètres...Pour les codes d'échappements et les métacaractères à la limite qui doivent sans doute être superflus.

                  dans le man stdio.h on retrouve le basique: les entrées/sorties. Et la définition de fonctions bien sûr.

                   #include <stdio.h>
                  
                       FILE *stdin;
                       FILE *stdout;
                       FILE *stderr;
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 juin 2021 à 8:56:37

                    Ben du coup je sais que je recommanderai jamais cette école à quiconque.

                    Pourquoi passer son permis sur une voiture récente quand on peut la passer sur un 4L.

                    Après on s'étonne qu'en arrivant en entreprise les élèves ne connaissent rien au Java 16, C11, C++23, C# 9, etc.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    git is great because Linus did it, mercurial is better because he didn't.

                      17 juin 2021 à 14:31:28

                      markand a écrit:

                      Ben du coup je sais que je recommanderai jamais cette école à quiconque.

                      Pourquoi passer son permis sur une voiture récente quand on peut la passer sur un 4L.

                      Après on s'étonne qu'en arrivant en entreprise les élèves ne connaissent rien au Java 16, C11, C++23, C# 9, etc.

                      maroufle34 a écrit:

                      CNoéDormoy a écrit:

                      markand a écrit:

                      Qu'est-ce que c'est cette raison de droit d'utiliser ?!

                      Dans la vie on utilise ce qui est à disposition. Si on te demande de coder un snake graphique, sauf erreur de ma part tu vas utiliser des bibliothèques graphiques existantes pour ne pas tout réinventer.


                      Oui sauf que je vais passer 42 donc je n'ai pas le droit d'utiliser grand chose, par exemple en c on à pas le droit d'utiliser printf etc on doit tout refaire nous même ...


                      Pourquoi utiliser un makefile alors...On peut compiler sans.

                      C'est juste un métalangage, on peut très bien compiler son c sans make...

                      Bref peut être cette page pourra t'aider, parce que si tu ne peux pas utiliser du Makefil POSIX,  à vrai dire tu peux encore moins utiliser du Makefile pas POSIX, enfin ça parait être la vraie lignée.

                      Pour le printf tu peux le recoder par toi même à la limite si bon te semble. Même passer par de l'assembleur si ça augmente tes chances d'entrer en école, mais j'en doute un peu.

                      Après tout vouloir se passer de printf revient à se passer stdio.h...Un des includes les plus commun.

                      Donc tu lis le fichier stdio.h et tu te la recode à la main, façon à changer quelques paramètres...Pour les codes d'échappements et les métacaractères à la limite qui doivent sans doute être superflus.

                      dans le man stdio.h on retrouve le basique: les entrées/sorties. Et la définition de fonctions bien sûr.

                       #include <stdio.h>
                      
                           FILE *stdin;
                           FILE *stdout;
                           FILE *stderr;

                      C'est juste pour la piscine d'entrée c'est pour bien comprendre comment tout marche je pense :) ! Après je pense qu'on va avoir le droit d'utiliser les printf etc.. :) 


                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 juin 2021 à 15:11:03

                        Alors dans ce cas n'utilise pas make du tout.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        git is great because Linus did it, mercurial is better because he didn't.

                          17 juin 2021 à 19:16:09

                          markand a écrit:

                          Alors dans ce cas n'utilise pas make du tout.


                          C'est possible que je me trompe, je n'ai pas encore commencé ... :/
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 juin 2021 à 0:23:59

                            markand a écrit:

                            Ben du coup je sais que je recommanderai jamais cette école à quiconque.

                            Pourquoi passer son permis sur une voiture récente quand on peut la passer sur un 4L.

                            Après on s'étonne qu'en arrivant en entreprise les élèves ne connaissent rien au Java 16, C11, C++23, C# 9, etc.


                            D'un autre côté l'école 42 s'intéresse surtout à l'algorithmique...A vrai dire je ne m'y connais pas assez, surtout sur les entrées/sorties qui à nous programmeurs (enfin pas moi) de semi haut niveau (càd en C) n'auront jamais à utiliser du plus bas niveau que ça.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Makefile et Headers

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown