You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重新编译OPN2001条码扫描器应用遇LNK2005/LNK1169多重定义符号错误

解决VS2017编译OPN2001 Demo时LNK2005/1169重复定义问题

你在编译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使用方式不匹配也会触发这类错误:

    1. 右键项目 → 属性 → 配置属性 → 常规
    2. 找到「MFC的使用」选项,检查当前是「在共享DLL中使用MFC」还是「在静态库中使用MFC」
    3. 尝试切换到另一种方式(比如原来用静态就改成共享)后重新编译。因为uafxcwd.lib是静态调试版的MFC库,如果你的GridCtrl组件是用动态MFC编译的,就会出现符号重复。
  • 第三步:调整链接器符号处理策略(下策,谨慎使用)
    如果暂时无法修改代码或MFC配置,可以尝试让链接器强制接受重复符号:

    1. 右键项目 → 属性 → 配置属性 → 链接器 → 命令行
    2. 在「附加选项」中添加/FORCE:MULTIPLE。但注意这只是临时规避,可能会隐藏潜在的运行时问题,只有在万不得已时使用。
  • 第四步:检查字符集和预编译头设置

    1. 确认项目的字符集设置和SDK原始项目一致:项目属性 → 常规 → 字符集(选「使用多字节字符集」或「Unicode」,保持和原SDK匹配)
    2. 检查预编译头的包含顺序,确保MFC核心头文件(比如afxwin.h)在自定义的GridCtrl头文件之前被包含,避免因类定义顺序导致的冲突。

如果以上步骤都没解决问题,可以提供项目的这些配置信息:MFC使用方式、字符集设置、链接器附加依赖项列表,我可以帮你进一步排查。

内容的提问来源于stack exchange,提问作者LePatay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:02:59