Strumento per tenere traccia delle dipendenze #include [chiuso]


175

Qualche buon suggerimento? L'input sarà il nome di un file di intestazione e l'output dovrebbe essere un elenco (preferibilmente un albero) di tutti i file incluso direttamente o indirettamente.


4
Non si tratta di un "favorito" che include bene in gcc, ma msvs no. Quindi noi (I) stiamo cercando qualsiasi strumento.
fantastico

70
Perché continuo a trovare domande "off-topic" così utili?
jfritz42,

5
@ jfritz42: questo dovrebbe ricevere il premio "Comment of the Year"! Come può un moderatore etichettare una domanda "fuori tema" quando ci sono così tanti argomenti e così tanti utenti?
Totoro,

2
Volevo notare che ci sono molti più strumenti per gestire #includedipendenze come cpp-dependencies , iwyu e dep-matrix che è uno strumento abbastanza ingenuo scritto in Python.
nonsensickle

3
@ jfritz42 I numeri sono chiari: 123 voti e 62 preferiti. Molte persone lo vedono in questo modo. Strani standard SO. Dubito anche che tali domande avrebbero le stesse grandi risposte su SuperUser.
Andreas,

Risposte:


148

Se hai accesso a GCC / G ++, l' -Mopzione genererà l'elenco delle dipendenze. Non fa nessuna delle cose extra che fanno gli altri strumenti, ma dal momento che proviene dal compilatore, non c'è alcuna possibilità che raccolga i file dal posto "sbagliato".


60
-Hdà anche un albero!
SamB,

28
-MMsalta le intestazioni di sistema
TheJosh

3
Inoltre con l' -oopzione il compilatore scriverà l'output su file anziché su stdout.
Hi-Angel,

2
@SamB Funziona solo se non ci sono errori e stampa stderrinvece di stdout. Altrimenti, questa opzione è più generale.
user877329

92

Grazie a KeithB. Ho cercato i documenti per cl.exe (VS2008) e ho trovato il flag / showIncludes. Dall'IDE, questo può essere impostato dalla pagina delle proprietà di qualsiasi file CPP.

Immagine dello schermo


1
Ciò è estremamente utile per risolvere alcuni errori / avvisi di compilazione molto difficili. Molte grazie!
Ashwin Nanjappa,

Questo è anche estremamente utile quando si cerca di ottimizzare le intestazioni precompilate!
fmuecke,

Quando lavoro in VS, penso che questa sia la soluzione più rapida per risolvere il mio problema ~ :-)
yaobin

Questo non sembra funzionare, se alcune intestazioni includono un'intestazione std c, ad esempiomath.h
abergmeier,

29

Per una soluzione pesante, dovresti dare un'occhiata a doxygen . Esegue la scansione della base di codice e crea un sito Web che documenta effettivamente il codice. Una delle tante cose che mostra è includere alberi.

Se stavi cercando di essere in grado di collegare l'output di questo strumento in qualche altro processo, allora questo potrebbe non funzionare per te (anche se doxygen produce output in altri formati, non ho molta familiarità con quella funzione). Se vuoi semplicemente controllare le dipendenze, però, dovrebbe funzionare alla grande.


20

Ho giocato con uno strumento chiamato cinclude2dot . È stato molto utile ottenere una maniglia su una base di codice piuttosto grande quando sono venuto a lavorare qui. Alla fine ho pensato di integrarlo nella nostra build quotidiana.


2
Questo strumento funziona eccezionalmente bene. Ho avuto problemi con g ++ di -M e doxygen.
sleeparrow,

Ho scritto uno script Python per leggere l'output di cinclude2dot e ottenere tutta la dipendenza in una mappa e quindi eseguire il primo attraversamento di profondità per produrre infine una foresta di fonti. La foresta che non contiene alcun .cc/.c/.cxxfile (solo i .hfile in essa contenuti) può essere ridondante.
shuva,

12

Innanzitutto, cinclude2dot.pl è uno script perl che analizza il codice C / C ++ e produce un grafico di dipendenza #include come file dot per l'input in graphviz.

http://www.flourish.org/cinclude2dot/

Se non vuoi seguire la strada per quel tipo di strumento manuale, allora il vincitore di gran lunga a mio avviso è uno strumento noto come "IncludeManager" di ProFactor.

http://www.profactor.co.uk/includemanager.php

C'è una prova gratuita ed è fantastico. È un plug-in per Visual Studio completamente integrato, quindi facendo doppio clic su qualcosa qui ti porta nel luogo in cui è incluso laggiù.

I mouseover della descrizione comandi ti danno tutte le informazioni che desideri e ti consentono di eseguire il drill-down / up, rimuovere interi sottotitoli che non ti interessano, visualizzare rappresentazioni diverse dai grafici, scorrere un elenco di corrispondenze per questo e quello, è meraviglioso.

Se sei veloce a riguardo, puoi riformattare la struttura #include di un grande progetto prima che finisca il processo. Anche così, non costa molto, circa $ 35 per licenza.

Per quello che fa, è quasi perfetto. Non solo grafici #include ma anche dipendenze tra progetti di file condivisi, impatto sui tempi di costruzione, proprietà dettagliate nelle griglie, perfetto.


Ho usato con successo IncludeManager nel mio progetto C. Sto usando Visual Studio 2013.
smwikipedia il

Un po 'sospettoso.
sdd

12

Buone notizie: redhat Source-Navigator (funziona anche su Windows). Naturalmente, gli switch del compilatore (menzionati in precedenza) hanno un analisi superiore e non sono sicuro di come gestirà MFC, Qt e le loro parole chiave magiche.

redhat Source-Navigator


5

Sulla base della risposta di KeithB , ecco la sintassi di GNUmake per 1) generare automaticamente i file delle dipendenze, 2) tenerli aggiornati e 3) usarli nel tuo makefile:

.dep:
    mkdir $@
.dep/%.dep: %.c .dep
    (echo $@ \\; $(CC) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
.dep/%.dep: %.cpp .dep
    (echo $@ \\; $(CXX) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
DEPEND := $(patsubst %.dep,.dep/%.dep,$(OBJ:.o=.dep))
-include $(DEPEND)

(Assicurati di cambiare questi rientri in hardtabs.)





Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.