Une version légèrement modifiée de celle de Sophie réponse qui permet de sortir les fichiers *.d dans un dossier différent (je ne collerai que la partie intéressante qui génère les fichiers de dépendance) :
$(OBJDIR)/%.o: %.cpp
# Generate dependency file
mkdir -p $(@D:$(OBJDIR)%=$(DEPDIR)%)
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -MM -MT $@ $< -MF $(@:$(OBJDIR)/%.o=$(DEPDIR)/%.d)
# Generate object file
mkdir -p $(@D)
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< -o $@
Notez que le paramètre
-MT $@
est utilisé pour s'assurer que les cibles (c'est-à-dire les noms des fichiers d'objets) dans les fichiers *.d générés contiennent le chemin complet vers les fichiers *.o et pas seulement le nom du fichier.
Je ne sais pas pourquoi ce paramètre n'est PAS nécessaire lorsqu'on utilise -MMD en combinaison avec -c (comme dans le cas de Sophie version ). Dans cette combinaison, il semble écrire le chemin complet des fichiers *.o dans les fichiers *.d. Sans cette combinaison, -MMD n'écrit que les noms de fichiers purs sans aucun composant de répertoire dans les fichiers *.d. Peut-être que quelqu'un sait pourquoi -MMD écrit le chemin complet lorsqu'il est combiné avec -c. Je n'ai pas trouvé d'indication dans la page de manuel de g++.
0 votes
Après avoir écrit ma réponse ci-dessous, j'ai regardé dans la liste connexe et j'ai trouvé : stackoverflow.com/questions/297514/ qui semble être un duplicata. La réponse de Chris Dodd est équivalente à la mienne, bien qu'elle utilise une convention de dénomination différente.