2011-03-23 10 views
7

¿Cómo construyo un árbol de dependencias usando C++? Por árbol de dependencias quiero decir, por ejemplo, verificar qué archivos necesita un cierto programa para ejecutarse. Al verificar eso, pude encontrar si hay archivos perdidos o corruptos.Construyendo árboles de dependencia

¿Cómo hago algo como eso?

edición:

No estoy buscando un programa que lo hace por mí!

+0

Gracias, conozco esa herramienta, pero estoy buscando cómo hacerlo por mi cuenta. Por supuesto, no necesito algo tan complejo como esta herramienta. Solo quiero construir una lista de dependencia muy básica. – Lockhead

+1

Suponiendo que desea hacer esto para el ejecutable en lugar del código fuente, deberá especificar la plataforma (después de la compilación, se preocupa por el formato ejecutable, no el idioma del código fuente). –

+0

Lo necesito multiplataforma – Lockhead

Respuesta

2

No hay un método multiplataforma para calcular dependencias, porque esto no es realmente un problema de C++. Está relacionado con el formato ejecutable generado por el compilador, y eso es diferente en cada plataforma.

En Linux (y probablemente en otras Unices), el comando ldd es lo que desea. Esto imprime los módulos (recursivos) que requerirá el ejecutable y también le indica dónde se encuentran actualmente en su sistema.

En Windows, Dependency Walker es una excelente herramienta gráfica que le permite explorar todas las DLL de las que depende un ejecutable (u otra DLL).

+0

Por supuesto, esto solo detecta dependencias en otras bibliotecas. Si está buscando * todos * los archivos que necesita ejecutar un programa (como archivos de imagen, etc., así como las bibliotecas cargadas dinámicamente en tiempo de ejecución), no existe una forma sencilla de hacerlo, ya que los archivos no se determinan en compilación hora. En Linux, 'strace' (grep la salida para' abrir') le dice todos los archivos que el proceso abre en tiempo de ejecución, pero por supuesto solo le informa sobre esa ejecución particular del programa, no todos los archivos posibles que intentará abrir . – mgiuca

+0

Pero eso todavía no me dice cómo construir realmente un árbol de dependencias en, por ejemplo, Windows (olvidemos por ahora Linux porque la mayoría de mis usuarios están en Windows). Puedo hacerlo con una herramienta, pero estoy buscando cómo escribir un programa C++ para hacerlo, posiblemente usando una biblioteca. – Lockhead

+0

No sé cómo lo haría en Windows. En Linux, sería fácil, porque ldd es una herramienta de línea de comandos. Simplemente abriría un socket a ldd y leería el texto que sale de él. En Windows, las personas generalmente compilan herramientas GUI que son imposibles de acceder programáticamente. – mgiuca

0

Una sugerencia cuando se habla de Windows: puede escribir un módulo que capte todas las llamadas para abrir, leer, escribir, ... un archivo de su aplicación y compila la lista de archivos solicitados, posiblemente filtrando dichos archivos como estándar entrada/salida, puertos, dispositivos, etc.

Puede hacer esto también en Linux (esto es incluso más fácil que en Windows).

De todos modos, no me doy cuenta de cómo se puede construir una jerarquía (árbol). Por las dudas: puede usar esta solución en pareja con otra (como ldd, dep walker, etc.).

+0

¿Cómo escribo ese módulo? – Lockhead

+0

Si necesita información general sobre esta búsqueda de preguntas con google 'Windows API hook'. Hay artículos excelentes de MS-Rem en [wasm.ru] (http://wasm.ru/publist.php?list=21#series_8) pero desafortunadamente en ruso. También encontré una biblioteca especial escrita para este propósito [hook-api] (http: //www.hook-api.com /) pero nunca lo he usado. Si necesita una respuesta más específica (cómo exactamente puede escribirla, qué funciones de API se pueden usar, etc.) simplemente cree una nueva pregunta o envíeme un correo electrónico :) – maverik

+0

Si puede usar ese módulo para construir un árbol de dependencias, realmente necesito saber cómo escribirlo Supongo que te enviaré un correo. ¿Cuál es tu correo electrónico? ¡Gracias! – Lockhead