Hintergrund
Ich habe ein großes Makefile
Projekt, das ich auf dem arbeite ich möchte ein wenig aufzuräumen. Es baut mehrere Dutzend Teilprojekte auf, von denen jedes ungefähr 100 .cpp
und .h
Dateien enthält. Ich habe es so eingerichtet, dass es debug
und release
Builds für mehrere Betriebssysteme (Linux, OSX/Mac, QNX usw.) und für mehrere Architekturen (x86/i386
, x64/amd64
, armhf
, arm64/aarch64
) parallel erstellen kann. Dies liegt daran, dass es sich um ein riesiges Projekt handelt, und der einzige Weg, um es schnell zu erstellen, ist parallel zu mehreren Tool-Ketten.GCC - Mehrere vorkompilierte Header und bestimmte Pfade
Ich habe eine Master-Regel, die alle Projekte gehorchen, die die Zwischenobjekte (dh: .o
Dateien) in temporären Verzeichnissen beim Erstellen speichert. Also, Gebäude test.c
für Linux, Arm64, Release-Modus; bauen würde die Objektdatei in dem folgenden Unterverzeichnis in dem vorliegenden Arbeitsverzeichnis:
.tmp/Linux/arm64/release
Probleme
Diese Funktion ohne Probleme funktioniert in meinem baut, aber mit diesem Setup, ich scheint nicht korrekt vorkompilierte Header (dh: .GCH
Dateien) mit GCC zu verwenden. Mit meinem Setup habe ich ein stdafx.h
/ Paar. Mit GCC kann ich einfach eine stdafx.h.gch
Datei erstellen. Das Projekt scheint es jedoch nur zu verwenden (was den Build beschleunigt), wenn sich die Datei im selben Pfad wie die Quelldateien befindet. Wenn der vorkompilierte Header im Zwischenobjektpfad enthalten ist (z. B. .tmp/Linux/arm64/release
), wird er nicht erkannt oder verwendet. Selbst wenn ich den Include-Pfad explizit zum Pfad für Zwischenobjekte hinzufüge, der die gch
-Datei enthalten würde, schlägt er fehl. Wenn Sie den vollständigen Pfad zum Dateinamen selbst eingeben, wird er als ungültiges Linker-Skript behandelt und ignoriert.
So, das war meine erste Problemumgehung eine Regel zu machen, alle OS zu zwingen/Bogen auf anfängliche vorkompilierte Header Generation warten baut, anstatt eine gch
auf einer Basis pro-OS/Bogen zu bauen. Allerdings, wenn ich die gch
mit Release-Modus-Einstellungen und versuchen, make
ein Debug-Build bauen, ich die folgende Warnung erhalten:
warning: stdafx.h.gch: created with -gnone, but used with -gdwarf-2
Erstens, ich weiß nicht, ob das schwerwiegende Folgen für meine Build hat, und die zweite , unterschiedliche Betriebssysteme können unterschiedliche Kompilierzeitdefinitionsflags für die gch
Generation durchlaufen, also ist dies kein Anwendungsfall "für alle Fälle", soweit ich das sehen kann.
Frage
Wie kann ich dieses Problem umgehen, so dass der vorkompilierte Header ist in einer anderen Position als die $PWD
und kann durch GCC erkannt werden? Ich verwende derzeit gcc v5.3.1.
Vielen Dank.Hier
Können Sie eine der Kompilierung Zeilen schreiben Sie versucht haben, GCC zu bekommen das zu sehen 'gch' wenn es in einem anderen Ordner ist? – user657267
@ user657267 Sicher: 'INC + = .tmp/$ {OS_TYPE}/$ {CPU_TYPE}/$ {REL_TYPE}'. 'gcc $ {INC} -c $ {EINGABE} -o $ {AUSGABE}'. Nicht das hilfreichste, aber mein 'Makefile' ist sehr ausführlich und spiegelt die' include' Pfade wieder, die während des Builds benutzt wurden, und ich kann bestätigen, dass Header normalerweise von diesem Pfad gelöst werden, mit Ausnahme von '.gch' Dateien. – DevNull
Entschuldigung, ich meinte, dass es erweitert wurde, wenn es ausgeführt wird. – user657267