Pesadelo Externo Não Resolvido

Olá veteranos da indústria,

Eu sou um júnior na faculdade embarcando no meu primeiro estágio de programação de verão, e estou no meio da minha cabeça. A empresa para a qual estou trabalhando comprou uma aplicação colossal de outra empresa que vem se expandindo lentamente e modificando-a desde o início dos anos 90. A solução contém mais de 200.000 linhas de código distribuídas em mais de 300 arquivos. Toda a solução foi supostamente escrita para os padrões ANSI-C ++. O código é quase totalmente não documentado, e a maior parte dele parece hieróglifos para mim. Por fim, meu trabalho é portar esse código para o Linux embarcado. No momento, meu trabalho é simplesmente compilá-lo usando o Visual Studio 2008 no Windows XP.

Hoje, estou encontrando erros de vinculador como este:

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

Meu entendimento é que isso geralmente acontece quando diferentes projetos dentro de uma solução são compilados usando diferentesbibliotecas de tempo de execução. Existem 6 projetos na minha solução. 4 deles foram configurados para compilar usando a biblioteca de tempo de execução de DLL de depuração multi-threaded (/ MDd), um deles foi definido para compilar usando a biblioteca de depuração multi-threaded (/ MTd), e um deles foi definido para compilar usando o biblioteca de tempo de execução multi-threaded dll (/ MD). A primeira coisa que tentei depois de receber essa mensagem de erro foi alterar as opções / MTd e / MD para / MDD para que tudo fosse compilado com as mesmas bibliotecas de tempo de execução. Infelizmente, isso levou ao seguinte erro em 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]

Depois de algumas escavações, descobri que já havia me dito o que eu precisava fazer. Eu fui em frente e alterei a opção "Uso do MFC" em Propriedades do Projeto-> Propriedades de Configuração-> Geral para "Usar MFC em uma DLL Compartilhada". Neste ponto, comecei a receber dezenas de erros externos não resolvidos como estes:

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)

Depois de ler as páginas do MSDN emLNK2001 eLNK2019Percebi que não tenho ideia do que está acontecendo. Estes não são o tipo de problemas que nos ensinaram a lidar na escola. Eu conheço minhas estruturas de dados, e é sobre isso. Como acabei onde estou agora está além de mim!

Do meu conhecimento limitado, parece que as várias versões de depuração e lançamento desses módulos estão emaranhadas em uma rede de diretivas de pré-processador e #includes. Há um número de verificações #ifdef e #define aninhadas feitas em quase todos os cabeçalhos e arquivos de origem em toda a solução para variáveis ​​de ambiente, nomes de arquivos, macros e possivelmente mais. Fazendo pequenas alterações nas configurações do meu compilador, parece que estou redirecionando grandes partes do programa para diferentes bibliotecas que possuem definições de função muito diferentes. Este é o meu entendimento conceitual vago sobre o que está acontecendo.

Eu sinto que vou precisar de um melhor entendimento de como esse código funciona antes de ter alguma chance de solucionar esses erros do compilador. Para esse fim, eu tenho tentado percorrer muitos dos arquivos linha por linha para ver onde eles levam, quais objetos e variáveis ​​estão no escopo e assim por diante. Infelizmente, isso não me leva muito longe, porque cada chamada para uma função externa é ambígua, e não tenho como ver através da confusão do pré-processador para saber qual versão de qualquer função deve ser chamada.

Eu estava procurando por soluções mágicas para mapear o programa e tentar entender. Eu tentei um chamadoDoxygen, mas ou eu não sei como usá-lo corretamente ou está ficando tão confuso com o material do pré-processador quanto eu.

Minha pergunta é esta:
Quais são minhas opções restantes?

Neste ponto, é um lance entre:
a.) Alternar majores
b) Pular de uma ponte

Nenhuma dessas opções vai me ajudar a entender melhor essa base de código e fazer com que ela seja compilada. Alguém tem alguma ideia melhor? Experiências semelhantes? Sábia sabedoria para compartilhar?

Obrigado uma tonelada
-Alex

questionAnswers(3)

yourAnswerToTheQuestion