Comment puis-je faire Makefile pour recompiler uniquement les fichiers modifiés?

J'ai été un peu en difficulté pour obtenir make pour compiler uniquement les fichiers qui ont été modifiés. Cependant, je n'ai pas eu beaucoup de succès et tous les fichiers sont recompilés. Quelqu'un peut-il m'expliquer pourquoi?

Mes fichiers sont:

main.c
a_functions.c

principal.c comprend principal.h
et a_functions.c comprend un.h

Voici mon makefile:

CC=gcc
CFLAGS=-Wall -I. -c
EXEC_FILE=program1


all: program

a_functions.o: a_functions.c
a_functions.c: a.h
main.o: main.c
main.c: main.h

objects: a_functions.c main.c
    $(CC) a_functions.c main.c $(CFLAGS)

program: a_functions.o main.o
    $(CC) a_functions.o main.o -o $(EXEC_FILE)

Modification du makefile que par des suggestions semble avoir le même problème::

all: program

a_functions.o: a_functions.c a.h
    gcc a_functions.c -c

main.o: main.c main.h
    gcc main.c -c

program: a_functions.o main.o
    gcc a_functions.o main.o -o program1
  • -I. me paraît étrange. Qu'est-ce qui?
  • juste des moyens de recherche pour inclure les fichiers dans le répertoire en cours ainsi que la mise en œuvre-définis. Si besoin est discutable, mais je ne pense pas qu'il serait la cause de tout mal.
  • peut-être, mais je suppose que c'est un symptôme d'un autre problème. Si son programme ne fournit pas à l'échelle du système des en-têtes pour quelque chose et il se doit de fournir à ses propres versions, c'est une chose, mais je suppose que c'est une erreur qu'il est...
  • Comment est que peut-être une erreur? Il y a certainement des fichiers d'en-tête qui doivent être inclus dans le répertoire courant dans pratiquement n'importe quel programme que vous avez envie de compiler.
  • Je l'ai enlevé et il a toujours le même problème
  • J'ai plus été pensée pour des choses comme a.h dans le répertoire courant. La valeur par défaut peut bien avoir (par exemple) /usr/include pour le système d'en-têtes, mais pas . pour les spectacles locaux. Je suis à peu près certain de tous gcc je n'ai jamais utilisé aussi regardé dans le répertoire courant par défaut (le comportement réel de la mise en œuvre est définie), mais il peut être une étrange variante ici.
  • Ce n'est pas une bonne idée de changer les questions d'une manière qui invalide les réponses. Hésitez pas à compléter les informations (voir mon edit) sinon devient beaucoup moins utile puisque les réponses ne correspondent pas aux questions.
  • vous avez raison. Va garder à l'esprit pour les questions d'avenir 🙂
  • dans ce cas, pourquoi ne pas utiliser #include "a.h" d'inclure le fichier plutôt que de #include <a.h>?
  • Nous ne pouvons pas #include <un.h> le <> les symboles sont utilisés pour rechercher l'en-tête dans les répertoires système. Je n'ai, en effet, utiliser #include "un.h" comme prévu. Je ne suis pas sûr mais pourquoi ne pas avoir TOUT comprendre, mais en utilisant -I. au lieu de cela ne fonctionne pas.

InformationsquelleAutor Pithikos | 2011-10-19