2008-09-03 24 views
141

¿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 que lo incluyan directa o indirectamente.Herramienta para rastrear #include dependencias

+0

Esto es similar a (pero no un duplicado de) http://stackoverflow.com/questions/74326/how-should-i-detect-unnecessary-include-files- in-a-large-c-project –

+4

No se trata de un "favorito" incluye se muestran muy bien en gcc, pero msvs no. Entonces nosotros (yo) estamos buscando cualquier herramienta. – fantastory

+28

¿Por qué sigo encontrando preguntas "fuera del tema" tan útiles? – jfritz42

Respuesta

123

Si tiene acceso a GCC/G ++, el -M option dará salida a la lista de dependencias. No hace ninguna de las cosas extra que hacen las otras herramientas, pero dado que proviene del compilador, no hay posibilidad de que recoja archivos del lugar "incorrecto".

+51

'-H ¡incluso da un árbol! – SamB

+21

'-MM' salta encabezados de sistema – TheJosh

+2

También con la opción' -o' el compilador va a escribir la salida en archivo en lugar de stdout. –

26

Para obtener una solución de gran peso, debe consultar Doxygen. Explora su código base y crea 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 otro proceso, puede que esto no funcione para usted (aunque Doxygen sí lo hace a otros formatos, no estoy muy familiarizado con esa característica). Sin embargo, si simplemente quieres ver las dependencias, debería funcionar muy bien.

19

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

+2

Esta herramienta funciona excepcionalmente bien. Tuve problemas con g ++ 's -M y doxygen. – sleeparrow

+0

Escribí un script de python para leer la salida de cinclude2dot y obtener toda la dependencia en un mapa y luego hacer depth-first-traversal para finalmente generar un bosque de fuentes. El bosque que no tiene ningún archivo '.cc/.c/.cxx' en eso (solo los archivos' .h' en él) puede ser redundante. – shuva

2

Understand for C++ debería ser capaz de ayudarlo: crea una base de datos a la que puede acceder desde Perl.

85

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.

Screen shot

+0

Esto es * extremadamente * útil para resolver algunos errores/advertencias de compilación muy difíciles. ¡Muchas gracias! –

+0

¡Esto también es ** extremadamente ** útil al tratar de optimizar los encabezados precompilados! – fmuecke

+0

Cuando trabajo en VS, creo que esta es la solución más rápida para resolver mi problema ~ :-) – yaobin

10

Buenas noticias: redhat Source-Navigator (se ejecuta en Windows también). Por supuesto, los modificadores del compilador (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

1

cscope (http://cscope.sourceforge.net/) hace de una xterm independiente, y también se puede utilizar dentro de su editor favorito - que tiene grandes emacs y soporte vi/vim.

3

Basándose en KeithB's answer, aquí es la sintaxis gnumake de forma automática 1) generar los archivos de dependencia, 2) mantenerlos al día, y 3) los usa en su makefile:

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

(Asegúrese de cambiar esas sangrías a hardtabs.)

12

Primero, cinclude2dot.pl es un script perl que analiza el código C/C++ y produce un #include dependency graph como un archivo de puntos para la entrada en graphviz.

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

Si no desea seguir el camino de ese tipo de herramienta manual, a continuación, las manos hacia abajo por el ganador ahora 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 impresionante. Se trata de un complemento para Visual Studio que está totalmente integrado, por lo que al hacer doble clic en algo aquí se accede al lugar donde está incluido allí.

Tooltip mouseovers le ofrece toda la información que le gustaría, y le permite profundizar, 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 proyectos grandes antes de que se agote 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 las dependencias entre proyectos de archivos compartidos, el impacto en los tiempos de compilación, las propiedades detalladas en las grillas, perfecto.

+0

He utilizado satisfactoriamente IncludeManager en mi proyecto C. Estoy usando Visual Studio 2013. – smwikipedia

Cuestiones relacionadas