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.


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


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


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.


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.


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.


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


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





Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.