Actualmente estoy trabajando en un marco de compilación de C/C++ flexible que (con suerte) abriré fuente bastante pronto. (Consulte la pregunta this para obtener más información).Genera automáticamente dependencias de archivo de objeto (vinculador) para ejecutables de C/C++
Estoy utilizando el siguiente comando para generar las dependencias del archivo #include para los archivos fuente/encabezado.
gcc -M -MM -MF
¿Hay una manera de inferir inteligentemente dependencias enlazador (.o archivos ejecutables) para (pruebas unitarias + ejecutable principal para la plataforma de destino en mi caso) utilizando gcc utilidades de GNU/de una manera similar a la anterior? Actualmente, el marco hace muchas suposiciones y es bastante tonto al determinar estas dependencias.
He oído hablar de un enfoque donde el comando nm se puede utilizar para obtener una lista de símbolos indefinidos en un archivo de objeto. Por ejemplo, correr nm en un archivo objeto (compilado usando gcc -c) se le ocurre algo como esto -
nm -o module.o
module.o: U _undefinedSymbol1
module.o: U _undefinedSymbol2
module.o:0000386f T _definedSymbol
uno podría buscar otros archivos de objetos, donde estos símbolos no definidos son definido para llegar a una lista de las dependencias de archivos objeto requeridas para vincular exitosamente el archivo.
¿Se considera esto como la mejor práctica para determinar las dependencias del vinculador para los ejecutables? ¿Hay alguna otra forma de inferir estas dependencias? Suponga que todos los archivos de objeto ya existen (es decir, que ya se han compilado utilizando gcc -c) al proponer su solución.
¿Cuál sería el punto de partida para este enfoque? Inicialmente no tiene archivos de objeto y, por lo tanto, no hay nada que examinar con 'nm' ... –
Suponga que todos los archivos se han compilado (es decir, justo antes del proceso de vinculación) y que ya existen sus correspondientes archivos de objeto. – thegreendroid
En cuyo caso, no hay dependencias para resolver. Si B es una dependencia de A, significa que B es necesario para * crear * A. –