Кошмар неразрешенных внешних явлений

Здравствуйте, ветераны индустрии,

Я учусь на первом курсе колледжа и начинаю свою первую летнюю стажировку по программированию, и я нахожусь выше своих сил. Компания, в которой я работаю, приобрела колоссальное приложение у другой компании, которая медленно расширяла и модифицировала его с начала 90-х годов. Решение содержит более 200 000 строк кода, распределенных по более чем 300 файлам. Все решение предположительно было написано в соответствии со стандартами ANSI -C++. Код почти полностью недокументирован, и большая его часть мне кажется иероглифами. В конечном счете, моя работа состоит в том, чтобы перенести этот код на встроенный Linux. На данный момент моя работа заключается в том, чтобы просто скомпилировать его с помощью Visual Studio 2008 в Windows XP.

Сегодня я столкнулся с ошибками компоновщика, такими как эта:

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

Насколько я понимаю, это часто происходит, когда разные проекты в рамках решения компилируются с использованием разных библиотек времени выполнения . В моем решении 6 проектов. 4 из них были настроены на компиляцию с использованием многопоточной -библиотеки времени выполнения отладки DLL (/MDd ), один из них был настроен на компиляцию с использованием многопоточной -библиотеки отладки (/MTd ), и один из них был настроен на компиляцию с использованием многопоточной -библиотеки времени выполнения dll (/MD ). Первое, что я попробовал после получения этого сообщения об ошибке, — изменить переключатели /MTd и /MD на /MDd, чтобы все скомпилировалось с одними и теми же библиотеками времени выполнения. К сожалению, это привело к следующей ошибке в 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]

Немного покопавшись, я обнаружил, что он уже сказал мне, что мне нужно сделать.Я пошел дальше и изменил параметр «Использование MFC» в разделе «Свойства проекта» -> «Свойства конфигурации» -> «Общие» на «Использовать MFC в общей библиотеке DLL». В этот момент я начал получать десятки неразрешенных внешних ошибок, таких как эти:

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):ошибка LNK2001 :неразрешенный внешний символ "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)

Прочитав страницы MSDN LNK2001 и LNK2019 , я понял, что понятия не имею, что происходит. Это не те проблемы, с которыми нас учили решать в школе. Я знаю свои структуры данных, и это все. Как я оказался там, где я сейчас, не понимаю!

Из моих ограниченных знаний кажется, что различные отладочные и выпускные версии этих модулей запутаны в паутине директив препроцессора и #include. Существует ряд вложенных #проверок ifdef и #операторов определения, которые выполняются почти в каждом заголовке и исходном файле решения для переменных среды, имен файлов, макросов и, возможно, многого другого. Внося даже небольшие изменения в настройки моего компилятора, я, похоже, перенаправляю большие части программы в разные библиотеки, которые имеют очень разные определения функций. Это мое смутное концептуальное понимание того, что происходит.

Я чувствую, что мне нужно лучше понять, как работает этот код, прежде чем у меня появится шанс устранить эти ошибки компилятора. С этой целью я пытался просмотреть многие файлы построчно, чтобы увидеть, куда они ведут, какие объекты и переменные находятся в области действия и так далее. К сожалению, это не очень далеко, потому что каждый вызов внешней функции неоднозначен,и у меня нет возможности увидеть сквозь беспорядок препроцессора, чтобы узнать, какая версия любой данной функции должна вызываться.

Я искал волшебные решения, чтобы наметить программу и попытаться разобраться в ней. Я попробовал один под названием Doxygen , но либо я не знаю, как правильно его использовать, либо он так же запутался в препроцессоре, как и я.

Мой вопрос таков:
Какие у меня остались варианты?

На данный момент это жеребьевка между:
а. )Сменить специальность
б. )Спрыгнуть с моста

Ни один из этих вариантов не поможет мне лучше понять кодовую базу и скомпилировать ее. У кого-нибудь есть лучшие идеи? Подобные опыты? Мудростью мудреца поделиться?

Большое спасибо,
-Алекс

5
задан Alex Jansen 13 July 2012 в 21:56
поделиться