Herramienta para rastrear #incluir dependencias [cerrado]

175

¿Alguna buena sugerencia? La entrada será el nombre de un archivo de encabezado y la salida debe ser una lista (preferiblemente un árbol) de todos los archivos, incluso de forma directa o indirecta.

Agnel Kurian
fuente
44
No se trata de que un "favorito" se muestre bien en gcc, pero msvs no. Entonces (I) estamos buscando cualquier herramienta.
fantastory
70
¿Por qué sigo encontrando preguntas "fuera de tema" tan útiles?
jfritz42
55
@ jfritz42: ¡Esto debería recibir el premio "Comentario del año"! ¿Cómo puede un moderador etiquetar una pregunta como "fuera de tema" cuando hay tantos temas y tantos usuarios?
Totoro
2
Quería señalar que hay muchas más herramientas para lidiar con #includedependencias como cpp-dependencies , iwyu y dep-matrix, que es una herramienta bastante ingenua escrita en python.
nonsensickle
3
@ jfritz42 Los números son claros: 123 votos y 62 favoritos. Mucha gente lo ve de esta manera. Extraños estándares de SO. También dudo que tales preguntas tengan las mismas excelentes respuestas en SuperUser.
Andreas

Respuestas:

148

Si tiene acceso a GCC / G ++, entonces el -M opción generará la lista de dependencias. No hace ninguna de las cosas adicionales que hacen las otras herramientas, pero como proviene del compilador, no hay posibilidad de que recoja archivos del lugar "incorrecto".

KeithB
fuente
6060
-Hincluso da un árbol!
SamB
28
-MMomite encabezados del sistema
TheJosh
3
También con la -oopción, el compilador escribirá la salida en el archivo en lugar de stdout.
Hola Ángel
2
@SamB Esto solo funciona si no hay errores y se imprime en stderrlugar de stdout. De lo contrario, esta opción es más general.
user877329
92

Gracias a KeithB. Busqué los documentos para cl.exe (VS2008) y encontré el indicador / showIncludes. Desde el IDE, esto se puede configurar desde la página de propiedades de cualquier archivo CPP.

Captura de pantalla

Agnel Kurian
fuente
1
Esto es extremadamente útil para resolver algunos errores / advertencias de compilación muy difíciles. ¡Muchas gracias!
Ashwin Nanjappa
¡Esto también es extremadamente útil cuando se trata de optimizar encabezados precompilados!
fmuecke
Cuando trabajo en VS, creo que esta es la solución más rápida para resolver mi problema ~ :-)
yaobin
Esto no parece funcionar, si algún encabezado incluye un encabezado std c, por ejemplomath.h
abergmeier
29

Para una solución de peso pesado, debe consultar doxygen . Escanea a través de su base de código y aparece un sitio web, efectivamente, que documenta su código. Una de las muchas cosas que muestra es incluir árboles.

Si estaba buscando poder conectar la salida de esta herramienta a algún otro proceso, entonces esto puede no funcionar para usted (aunque doxygen sí da salida a otros formatos, no estoy muy familiarizado con esa característica). Sin embargo, si simplemente desea observar las dependencias, debería funcionar muy bien.

Matt Dillard
fuente
20

He jugado con una herramienta llamada cinclude2dot . Fue muy útil para manejar una base de código bastante grande cuando vine a trabajar aquí. De hecho, he pensado en integrarlo en nuestra construcción diaria eventualmente.

Brian Stewart
fuente
2
Esta herramienta funciona excepcionalmente bien. Tuve problemas con g ++ 's -M y doxygen.
Sleeparrow
Escribí un script de Python para leer el resultado de cinclude2dot y obtener toda la dependencia en un mapa y luego hacer un recorrido de profundidad primero para finalmente generar un bosque de fuentes. El bosque que no tiene ningún .cc/.c/.cxxarchivo en él (solo los .harchivos) puede ser redundante.
shuva
12

Primero, cinclude2dot.pl es un script perl que analiza el código C / C ++ y produce un gráfico de dependencia #include como un archivo de puntos para ingresar en graphviz.

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

Si no quiere seguir ese tipo de herramienta manual, entonces el ganador indiscutible es, en mi opinión, una herramienta conocida como "IncludeManager" de ProFactor.

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

Hay una versión de prueba gratuita, y es increíble. Es un complemento para Visual Studio que está totalmente integrado, por lo que hacer doble clic en algo aquí lo lleva al lugar donde está incluido allí.

Los mouseovers de información sobre herramientas le brindan toda la información que desea, y le permite profundizar / eliminar, eliminar subárboles enteros que no le interesan, ver representaciones que no sean gráficos, recorrer una lista de coincidencias para esto y aquello, es maravilloso.

Si es rápido al respecto, puede refactorizar la estructura #include de grandes proyectos antes de que se acabe la prueba. Aun así, no cuesta mucho, alrededor de $ 35 por licencia.

Por lo que hace, es casi perfecto. No solo #incluye gráficos, sino también dependencias de proyectos compartidos de archivos compartidos, impacto en tiempos de compilación, propiedades detalladas en cuadrículas, perfecto.

Allbite
fuente
He utilizado con éxito IncludeManager en mi proyecto C. Estoy usando Visual Studio 2013.
smwikipedia
Un poco sospechoso
sdd
12

Buenas noticias: redhat Source-Navigator (también se ejecuta en Windows). Por supuesto, los conmutadores de compilación (mencionados anteriormente) tienen un análisis superior y no estoy seguro de cómo manejará MFC, Qt y sus palabras clave mágicas.

redhat Source-Navigator

Agnel Kurian
fuente
5

Basándose en la respuesta de KeithB , aquí está la sintaxis de GNUmake para 1) generar automáticamente los archivos de dependencia, 2) mantenerlos actualizados y 3) usarlos en su archivo MAKE:

.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)

(Asegúrese de cambiar esas sangrías a pestañas duras).

cxw
fuente
3

Comprenda que C ++ debería poder ayudarlo: crea una base de datos a la que puede acceder desde Perl.

Xavier Nodet
fuente
Comprender es comercial, pero es increíble en mi opinión. Puedes probarlo gratis.
skelliam
1

cscope ( http://cscope.sourceforge.net/ ) hace esto en un xterm independiente, y también puede usarse dentro de su editor favorito: tiene un gran soporte para emacs y vi / vim.

svec
fuente