Ale*_*sen 5 c++ mfc doxygen lnk2019 lnk2001
业内资深人士,
我是大学三年级学生,开始了我的第一个夏季编程实习,而且我在脑海里.我所工作的公司从另一家公司购买了一个巨大的应用程序,自90年代初以来,该公司已经慢慢地扩展和修改它.该解决方案包含超过200,000行代码,分布在300多个文件中.据称整个解决方案都是按照ANSI-C++标准编写的.代码几乎完全没有记录,大部分代码对我来说都是象形文字.最终,我的工作是将此代码移植到嵌入式Linux.目前,我的工作只是在Windows XP上使用Visual Studio 2008进行编译.
今天,我遇到了像这样的链接器错误:
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"选项更改为"在共享DLL中使用MFC".此时我开始收到许多未解决的外部错误,例如:
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)
libcmtd.lib(sprintf.obj) : error LNK2005: _sprintf already defined in msvcrtd.lib(MSVCR90D.dll)
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]
在阅读了LNK2001和LNK2019上的MSDN页面后,我意识到我不知道发生了什么.这些不是他们告诉我们如何在学校处理的问题.我知道我的数据结构,这就是它.我如何走到现在的位置超出了我!
从我有限的知识来看,似乎这些模块的各种调试和发布版本都被预处理器指令和#include网络纠缠在一起.在环境变量,文件名,宏等可能的解决方案中,几乎每个头文件和源文件都有许多嵌套的#ifdef检查和#define语句.通过对我的编译器设置进行微小的更改,我似乎将程序的大部分内容重定向到具有非常不同的函数定义的不同库.这是我对正在发生的事情的模糊概念理解.
在我有机会解决这些编译器错误之前,我觉得我需要更好地理解这段代码是如何工作的.为此,我一直试图逐行浏览许多文件,以查看它们的引导位置,范围内的对象和变量,等等.不幸的是,这并没有让我走得太远,因为对外部函数的每次调用都是模棱两可的,而且我无法通过预处理器看到混乱来知道应该调用任何给定函数的哪个版本.
我正在四处寻找魔术解决方案来制定程序并尝试理解它.我尝试了一个名为Doxygen,但要么我不知道如何正确使用它,要么就像我一样对预处理器的东西感到困惑.
我的问题是:
我剩下的选择是什么?
在这一点上,它之间是一个折腾:
a.)切换专业
b.)跳下一座桥
这些选择都不会帮助我更好地理解这个代码库并进行编译.有没有人有更好的想法?类似的经历?贤者智慧分享?
非常感谢,
-Alex