Gcc-Abhängigkeitsgenerierung für ein anderes Ausgabeverzeichnis
Bin ich mit dem gcc Compiler zum erzeugen einer dependency-Datei, aber mein build Regeln die Ausgabe in ein Unterverzeichnis. Gibt es eine Möglichkeit zu sagen, gcc, mein Unterverzeichnis Präfix in der dependency-Datei, die es erzeugt für mich?
gcc $(INCLUDES) -E -MM $(CFLAGS) $(SRC) >>$(DEP)
InformationsquelleAutor der Frage KPexEA | 2008-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort ist in der GCC Handbuch: verwenden Sie die
-MT
Flagge.InformationsquelleAutor der Antwort bk1e
Ich bin davon ausgegangen, dass Sie GNU-Make und GCC. Zuerst fügen Sie eine variable, um Ihre Liste der Abhängigkeitsdateien. Wenn Sie bereits eine haben, in der alle unsere Quellen:
Dann den generierten Abhängigkeiten im makefile:
Dann fügen Sie dieses Muster-Regel:
"$@" wird das Ziel (das Ding auf der linken Seite des : ), "$ " <" ist die Voraussetzung (das Ding auf der rechten Seite : ). Der Ausdruck "$(<:.c=.o)" ersetzt .c-Erweiterung mit .o.
Der trick hier ist, um zu erzeugen, die in der Regel mit zwei Zielen durch das hinzufügen von -MT zweimal; dies macht sowohl die .o-Datei und der .d-Datei sind die Quell-Datei und die Header; so wird die Abhängigkeit-Datei wird automatisch regeneriert, sobald die entsprechenden .c oder .h Dateien geändert werden.
- MG und MP-Optionen halten, machen Sie aus freaking heraus, wenn Sie eine header-Datei fehlt.
InformationsquelleAutor der Antwort Don McCaughey
Können Sie gerne auf diese kürzere version von Don 'McCaughey' s Antwort:
DEPS = $(SRCS:.c=.d)
Hinzufügen
-include $(DEPS)
Hinweis: die-
Präfix, die Stille Fehler, wenn der.d
Dateien noch nicht existieren.Gibt es keine Notwendigkeit für eine separate Muster-Regel generiert die dependency-Dateien. Fügen Sie einfach
-MD
oder-MMD
zu Ihrem normalen Kompilierung Zeile, und die.d
Dateien generiert, die zur gleichen Zeit Ihre Quelldateien kompiliert werden. Zum Beispiel:InformationsquelleAutor der Antwort Steve Pitchers
Detailliert auf DGentry Antwort, das hat gut für mich gearbeitet:
Funktioniert das auch in dem Fall, wo es nur eine Abhängigkeiten gelten Datei enthält die Regeln für Abhängigkeiten für alle Quell-Dateien.
InformationsquelleAutor der Antwort rsp1984
Wenn es ein argument für gcc um dies zu tun, ich weiß nicht, was es ist. Wir landen Rohrleitungen die Abhängigkeit der Ausgabe durch sed neu zu schreiben, alle vorkommen .o, wie ${OBJDIR}/.o
InformationsquelleAutor der Antwort DGentry
Ok, nur um sicher zu gehen, habe ich die Frage richtig: ich nehme an, Sie haben test.c, die beinhaltet test.h, und Sie erzeugen wollen subdir/test.d (während nicht generieren subdir/test.o) wo subdir/test.d enthält
eher als
ist das, was Sie gerade bekommen. Ist das richtig?
Ich war nicht in der Lage zu kommen mit eine einfache Möglichkeit, genau das zu tun, was Sie für Fragen. Dennoch, mit Blick auf http://www.gnu.org/software/gcc/news/dependencies.htmlwenn Sie erstellen möchten .d Datei, während Sie generieren .o-Datei, die Sie verwenden können,
(SRC=test.c-SUBDIR=subdir, und OBJ=test.o) so erstellen Sie die beiden Ordner/test.o und das Unterverzeichnis/test.d, wo subdir/test.d enthält die gewünschte Ausgabe wie oben. Hoffe, das hilft.
InformationsquelleAutor der Antwort
[GNU] machen wird wütend, wenn Sie nicht platzieren Sie die Ausgabe in das aktuelle Verzeichnis. Was Sie wirklich tun sollten ist, führen Sie make aus dem build-Verzeichnis, und verwenden Sie die variable VPATH zu suchen, den source-code. Wenn Sie liegen, um einen compiler, früher oder später wird es nehmen Sie Ihre Rache.
Wenn Sie darauf bestehen, auf die Erzeugung Ihrer Objekte und Abhängigkeiten in einigen anderen Verzeichnis, müssen Sie verwenden die -o-argument so beantwortet werden, indem Emile.
InformationsquelleAutor der Antwort florin