各位行业资深人士,大家好:
我是一名大三学生,即将开始我的第一次暑期编程实习,但我的能力已经超出了我的能力范围。我工作的公司从另一家公司购买了一个庞大的应用程序,该公司自 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)进行编译,其中 1 个设置为使用多线程调试库(/MTd)进行编译,其中 1 个设置为使用多线程 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) : 错误 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)