Pesadilla Externa Sin Resolver

Hola veteranos de la industria,

Soy un estudiante de tercer año en la universidad que se está embarcando en mi primera pasantía de programación de verano, y estoy en el camino de la cabeza. La compañía para la que estoy trabajando ha comprado una aplicación colosal de otra compañía que la ha estado expandiendo y modificando lentamente desde principios de los años 90. La solución contiene más de 200,000 líneas de código que se distribuyen en más de 300 archivos. La solución completa supuestamente se ha escrito según los estándares ANSI-C ++. El código es casi totalmente indocumentado, y la mayoría de ellos me parecen jeroglíficos. En última instancia, mi trabajo es portar este código a Linux incorporado. En este momento, mi trabajo es simplemente compilarlo utilizando Visual Studio 2008 en Windows XP.

Hoy me encuentro con errores de enlace como este:

libcmtd.lib(sprintf.obj) : error LNK2005: _sprintf already defined in msvcrtd.lib(MSVCR90D.dll)

Mi entendimiento es que esto sucede a menudo cuando se compilan diferentes proyectos dentro de una solución usando diferentesbibliotecas de tiempo de ejecución. Hay 6 proyectos en mi solución. 4 de ellos se configuraron para compilar usando la biblioteca de tiempo de ejecución de DLL de depuración de múltiples subprocesos (/ MDd), uno de ellos se configuró para compilar usando la biblioteca de depuración de múltiples subprocesos (/ MTd), y uno de ellos se configuró para compilar usando la biblioteca de tiempo de ejecución de dll multi-hilo (/ MD). Lo primero que intenté después de recibir este mensaje de error fue cambiar los conmutadores / MTd y / MD a / MDd para que todo se hubiera compilado con las mismas bibliotecas de tiempo de ejecución. Desafortunadamente, esto llevó al siguiente error en afx.h:

fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]

Después de investigar un poco, descubrí que ya me había dicho lo que tenía que hacer. Seguí adelante y cambié la opción "Uso de MFC" en Propiedades del proyecto-> Propiedades de configuración-> General a "Usar MFC en una DLL compartida". En este punto comencé a recibir docenas de errores externos no resueltos, como los siguientes:

dataPropertySheet.obj : error LNK2019: unresolved external symbol "public: __thiscall CResizableSheet::CResizableSheet(unsigned short const *,class CWnd *,unsigned int)" (??0CResizableSheet@@QAE@PBGPAVCWnd@@I@Z) referenced in function "public: __thiscall CdataPropertySheet::CdataPropertySheet(unsigned short const *,class CWnd *,unsigned int)" (??0CdataPropertySheet@@QAE@PBGPAVCWnd@@I@Z)

ResizableLib.lib(ResizablePage.obj) : error LNK2001: unresolved external symbol "public: virtual int __thiscall CWnd::Create(char const *,char const *,unsigned long,struct tagRECT const &,class CWnd *,unsigned int,struct CCreateContext *)" (?Create@CWnd@@UAEHPBD0KABUtagRECT@@PAV1@IPAUCCreateContext@@@Z)

Después de leer las páginas de MSDN enLNK2001 yLNK2019, Me he dado cuenta de que no tengo ni idea de lo que está pasando. Estos no son el tipo de problemas que nos han enseñado a manejar en la escuela. Conozco mis estructuras de datos, y eso es todo. ¡Cómo terminé donde estoy ahora está más allá de mí!

Según mi conocimiento limitado, parece que las distintas versiones de depuración y lanzamiento de estos módulos están enredadas en una red de directivas de preprocesador y #incluye. Hay una serie de comprobaciones #ifdef anidadas y declaraciones #define realizadas en casi todos los encabezados y archivos fuente a lo largo de la solución para variables de entorno, nombres de archivos, macros y posiblemente más. Al realizar pequeños cambios en la configuración de mi compilador, parece que estoy redirigiendo grandes partes del programa a bibliotecas diferentes que tienen definiciones de funciones muy diferentes. Esta es mi vaga comprensión conceptual de lo que está pasando.

Siento que voy a necesitar una mejor comprensión de cómo funciona este código antes de tener la oportunidad de solucionar estos errores del compilador. Con ese fin, he estado tratando de recorrer muchos de los archivos línea por línea para ver a dónde conducen, qué objetos y variables están en el alcance, etc. Desafortunadamente, esto no me lleva muy lejos, porque cada llamada a una función externa es ambigua, y no tengo forma de ver a través del desorden del preprocesador para saber qué versión de cualquier función se debe llamar.

Estaba buscando soluciones mágicas para trazar el programa y tratar de darle sentido. Probé uno llamadoDoxygen, pero o bien no sé cómo usarlo correctamente o se está confundiendo tanto con el preprocesador como yo.

Mi pregunta es la siguiente:
¿Cuáles son mis opciones restantes?

En este punto es un lanzamiento entre:
a.) Cambiar mayores
b.) saltar desde un puente

Ninguna de estas opciones me ayudará a comprender mejor este código base ya compilarlo. ¿Alguien tiene alguna idea mejor? ¿Experiencias similares? Sabia sabiduría para compartir?

Gracias una tonelada,
-Alex

Respuestas a la pregunta(3)

Su respuesta a la pregunta