重新编译OPN2001条码扫描器应用遇LNK2005/LNK1169多重定义符号错误
你在编译OPN2001 Companion Application时遇到的链接错误:
LNK2005 "public: virtual __thiscall CMemDC::~CMemDC(void)" (??1CMemDC@@UAE@XZ) already defined in GridCtrl.obj [uafxcwd.lib(afxglobals.obj) line 1]
LNK1169 one or more multiply defined symbols found [OPN200x.exe]
这是典型的符号重复定义问题——CMemDC类同时在自定义的GridCtrl.obj和MFC静态调试库uafxcwd.lib的afxglobals.obj中被定义,链接器无法确定使用哪一个版本。结合MFC项目的常见踩坑点,给你几个具体的排查和解决步骤:
第一步:排查自定义CMemDC的命名冲突
先在解决方案资源管理器里全局搜索CMemDC,看看项目中是否存在自己实现的CMemDC类(大概率在GridCtrl相关的源文件或头文件里)。MFC本身就提供了CMemDC类,如果你的GridCtrl组件也实现了同名类,必然会引发冲突。- 解决办法:把自定义的
CMemDC重命名(比如改成CGridMemDC),然后替换所有代码中对这个类的引用。这是最直接的根本解决方式。
- 解决办法:把自定义的
第二步:统一MFC的链接方式
VS2017中,项目的MFC使用方式不匹配也会触发这类错误:- 右键项目 → 属性 → 配置属性 → 常规
- 找到「MFC的使用」选项,检查当前是「在共享DLL中使用MFC」还是「在静态库中使用MFC」
- 尝试切换到另一种方式(比如原来用静态就改成共享)后重新编译。因为
uafxcwd.lib是静态调试版的MFC库,如果你的GridCtrl组件是用动态MFC编译的,就会出现符号重复。
第三步:调整链接器符号处理策略(下策,谨慎使用)
如果暂时无法修改代码或MFC配置,可以尝试让链接器强制接受重复符号:- 右键项目 → 属性 → 配置属性 → 链接器 → 命令行
- 在「附加选项」中添加
/FORCE:MULTIPLE。但注意这只是临时规避,可能会隐藏潜在的运行时问题,只有在万不得已时使用。
第四步:检查字符集和预编译头设置
- 确认项目的字符集设置和SDK原始项目一致:项目属性 → 常规 → 字符集(选「使用多字节字符集」或「Unicode」,保持和原SDK匹配)
- 检查预编译头的包含顺序,确保MFC核心头文件(比如
afxwin.h)在自定义的GridCtrl头文件之前被包含,避免因类定义顺序导致的冲突。
如果以上步骤都没解决问题,可以提供项目的这些配置信息:MFC使用方式、字符集设置、链接器附加依赖项列表,我可以帮你进一步排查。
内容的提问来源于stack exchange,提问作者LePatay

