Frage

Ich bin erforderlichen Unterlagen für ein aktuelles Projekt zu schreiben, die jede .h-Datei alle .c-Dateien und für jeden einzelnen Listen aufgeführt, die von dieser Datei enthalten direkt oder indirekt ist.

Dies ist ein großes Projekt, und obwohl wir haben Makefiles, die theoretisch über diese Informationen verfügen, sind die Makefiles manchmal falsch (wir dieses Projekt von einem anderen Unternehmen übernommen). Wir haben oft hatten eine make clean ; make für unsere Änderungen zu tun, um tatsächlich in der Neuübersetzung reflektiert werden, so will ich nicht auf diesem Makefiles verlassen.

So ist es ein Werkzeug, das wir den Namen einer C-Datei läßt geben und einen Pfad enthalten und haben sie sagen uns alle der H-Dateien, die von der C-Datei direkt oder indirekt enthalten sind? Wir haben nichts seltsam wie

#define my_include "some_file.h"
#include my_include

so funktioniert das Tool nicht perfekt sein müssen. Alles, was .c und .h-Dateien in einem Include-Pfad für die regelmäßigen gesucht umfasst gut genug wäre.

War es hilfreich?

Lösung

Was ich in meinem Makefile ist

SRCS=$(wildcard *.c)

depend: $(SRCS)
    gcc -M $(CFLAGS) $(SRCS) >depend

include depend

Das bedeutet, dass, wenn eine der Quelldateien aktualisiert werden, wird die abhängig Regel ausgeführt, und verwenden Sie gcc -M die Datei depend genannt zu aktualisieren. Dies wird dann in der Make-Datei enthält, die Abhängigkeitsregeln für alle Quelldateien zur Verfügung zu stellen.

überprüfen Sie, ob eine Datei auf dem neuesten Stand ist es vor, einschließlich, so dass diese Regel abhängen wird ausgeführt, wenn notwendig, wenn Sie laufen zu lassen, ohne dass Sie ein „abhängig machen“ zu tun.

Dies wird zu jeder Zeit läuft jede Datei geändert hat. Ich habe festgestellt, das nie ein Problem, aber wenn Sie eine große Anzahl von Dateien in dem Verzeichnis, musste man könnte es zu lange gedauert hat, wobei in diesem Fall könnten Sie versuchen, pro Quelldatei eine Abhängigkeitsdatei ist, wie folgt aus:

SRCS=$(wildcard *.c)
DEPS=$(SRCS:.c=.dep)

%.dep : %.c
    gcc -M $(CFLAGS) $< >$@

include $(DEPS)

Beachten Sie, dass Sie -MM statt -M verwenden können, um nicht System-Header enthalten.

Andere Tipps

"gcc -M file.c" tut, was Sie brauchen.

Eine Alternative zu gcc -M ist fastdep . Fastdep des Autors berichtet fastdep zehnmal schneller sein als -M gcc. Wenn das Projekt eine Weile dauert, zu bauen, fastdep kann sich lohnen, einen Blick zu.

Verwenden SCons

$ scons --tree=all
scons: Reading SConscript files ...

scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
+-.
  +-SConstruct
  +-app
  | +-test.o
  | | +-test.c
  | | +-/include/PCI_1149_1.h
  | | +-/include/Pci.h
  | | +-/usr/bin/gcc
  | +-/usr/bin/gcc
  | +-/lib/libpci1149_64.a
  ...

In MSVC (2005 und 2008 zumindest möglicherweise andere Versionen als gut, aber nicht VC6) können Sie den Compiler erhalten Sie zu sagen, alle Dateien, die während der Kompilierung enthalten waren. Der Ausgang ist ziemlich ausführlich, aber vollständige und ziemlich einfach mit dem menschlichen Auge zu analysieren.

Projekteinstellungen finden Sie auf der C / C ++> Registerkarte Erweitert und wechseln „Show beinhaltet“, dann Ihr Projekt von Grund auf neu aufzubauen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top