Domanda

Sono tenuto a scrivere la documentazione per il mio progetto attuale che elenca tutti i file .c e per ognuno elenca tutti i file .h che sono inclusi direttamente o indirettamente da quel file.

Questo è un grande progetto, e sebbene abbiamo Makefile che teoricamente hanno queste informazioni, quei Makefile a volte sono errati (abbiamo ereditato questo progetto da un'altra società). Spesso abbiamo dovuto fare un make clean ; make affinché le nostre modifiche si riflettessero effettivamente nella ricompilazione, quindi non voglio fare affidamento su questi Makefile.

Quindi esiste uno strumento che ci consente di assegnargli il nome di un file .c e un percorso include e che ci dica tutti i file .h che sono inclusi direttamente o indirettamente dal file .c? Non abbiamo nulla di strano come

#define my_include "some_file.h"
#include my_include

quindi lo strumento non deve essere perfetto. Tutto ciò che ha cercato i file .c e .h in un percorso include per le inclusioni regolari sarebbe abbastanza buono.

È stato utile?

Soluzione

Quello che faccio nel mio Makefile è

SRCS=$(wildcard *.c)

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

include depend

Ciò significa che se uno dei file di origine viene aggiornato, verrà eseguita la regola di dipendenza e utilizzerà gcc -M per aggiornare il file chiamato dipendenza. Questo viene quindi incluso nel makefile per fornire le regole di dipendenza per tutti i file di origine.

Make controllerà che un file sia aggiornato prima di includerlo, quindi questa regola di dipendenza verrà eseguita se necessario ogni volta che esegui make senza che tu debba fare un " make depend ".

Questo verrà eseguito ogni volta che un file viene modificato. Non ho mai trovato questo un problema, ma se nella directory ci fosse un numero enorme di file potresti trovare che ci è voluto troppo tempo, nel qual caso potresti provare ad avere un file di dipendenza per file di origine, come questo:

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

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

include $(DEPS)

Nota che puoi usare -MM invece di -M per non includere le intestazioni di sistema.

Altri suggerimenti

" gcc -M file.c " fa quello che ti serve.

Un'alternativa a gcc -M è fastdep . L'autore di Fastdep riporta che Fastdep è dieci volte più veloce di -M di gcc. Se il progetto richiede un po 'di tempo per essere costruito, vale la pena dare un'occhiata a FastDep.

Usa 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 (almeno nel 2005 e nel 2008, possibilmente anche in altre versioni ma non in VC6) puoi ottenere dal compilatore che ti dica tutti i file inclusi durante la compilazione. L'output è piuttosto dettagliato, ma completo e abbastanza facile da analizzare con gli occhi umani.

In Impostazioni progetto, vai su C / C ++ > scheda Avanzate e attiva " Mostra Include, " quindi ricostruisci il tuo progetto da zero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top