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.
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".
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.
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.
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.
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.
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.
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.
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:
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.
#include
dependencias como cpp-dependencies , iwyu y dep-matrix, que es una herramienta bastante ingenua escrita en python.Respuestas:
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".fuente
-H
incluso da un árbol!-MM
omite encabezados del sistema-o
opción, el compilador escribirá la salida en el archivo en lugar de stdout.stderr
lugar destdout
. De lo contrario, esta opción es más general.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.
fuente
math.h
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.
fuente
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.
fuente
.cc/.c/.cxx
archivo en él (solo los.h
archivos) puede ser redundante.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.
fuente
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.
fuente
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:
(Asegúrese de cambiar esas sangrías a pestañas duras).
fuente
También puede consultar makedepend :
http://en.wikipedia.org/wiki/Makedepend
http://www.xfree86.org/current/makedepend.1.html
fuente
Comprenda que C ++ debería poder ayudarlo: crea una base de datos a la que puede acceder desde Perl.
fuente
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.
fuente
Hay una herramienta gratuita que incluye el Observador de dependencias de archivos
fuente