【问题标题】:Unresolved external symbol ATL::IAtlMemMgr after upgrading to Visual Studio 2019升级到 Visual Studio 2019 后未解析的外部符号 ATL::IAtlMemMgr
【发布时间】:2020-05-13 22:38:30
【问题描述】:

我目前正在将我们的源代码从 VS2012 升级到 VS2019。一个使用MFC的项目没有链接成功:

致命错误 LNK1120:4 个未解决的外部问题

错误 LNK2001:未解析的外部符号“public: void * __cdecl ATL::IAtlMemMgr::Allocate(unsigned __int64)”在函数“public: virtual struct ATL::CStringData * __cdecl ATL::CAtlStringMgr::Allocate(int ,int)"

错误 LNK2001:未解析的外部符号“public: void __cdecl ATL::IAtlMemMgr::Free(void *)”在函数“public: virtual void __cdecl ATL::CAtlStringMgr::Free(struct ATL::CStringData *)”中引用"

错误 LNK2001:未解析的外部符号“public: void * __cdecl ATL::IAtlMemMgr::Reallocate(void *,unsigned __int64)”在函数“public: virtual struct ATL::CStringData * __cdecl ATL::CAtlStringMgr::重新分配(struct ATL::CStringData *,int,int)"

错误 LNK2001: 无法解析的外部符号“public: virtual struct ATL::CStringData * __cdecl ATL::IAtlStringMgr::Reallocate(struct ATL::CStringData *,int,int)”

我们正在使用多字节字符集 (MBCS) 进行构建。我的第一个想法是,我们缺少 mbcs 库。但正如here 所述,默认情况下会安装这些库,“当您选择 MFC 和 ATL 支持时”。

我在代码中添加了atlbase.h,并手动添加了atls.lib作为附加依赖,但这并没有解决问题。

如何确定缺少哪个库?

编辑 1: 我们来看看atlmem.h

    __interface __declspec(uuid("654F7EF5-CFDF-4df9-A450-6C6A13C622C0")) IAtlMemMgr{
    public:
        _Ret_maybenull_ _Post_writable_byte_size_(nBytes) void* Allocate(_In_ size_t nBytes) throw();

据我所知,这是未找到的符号之一。正如__interface 关键字可能是红色的,它隐含地使函数成为纯虚拟函数。此类链接器错误可能是非纯虚函数声明的caused

可能有一个错误导致 __interface 中的函数不是纯虚拟的吗?

【问题讨论】:

  • 如果这是您获得的唯一未解决的外部,请尝试更改 /Zc:wchar_t 编译器选项。在 C++ 中,参数类型被分解为符号名称。不匹配将导致无法找到相应的符号。
  • 从 /Zc:wchar_t 更改为 /Zc:wchar_t- 并返回没有解决错误
  • 添加了 atlmem.h 和 atlsimpstr.h,但仍然有错误。我开始相信这些符号应该在 atls.lib 中,但无论出于何种原因,它们都不是。
  • 我建议您可以尝试添加atls.lib。根据DOC.When 项目引用了库 (.LIB) 或对象 (.OBJ) 文件,而该文件又需要来自另一个库的符号。即使您不调用导致依赖的函数,它也可能发生。要解决此问题,请将对其他库的引用添加到您的项目中。

标签: mfc linker-errors visual-studio-2019 atl


【解决方案1】:

在排除几乎所有源文件并注释掉很多功能后,我可以看到链接器错误与<afxwin.h> 相关。将 <afxwin.h> 移动到每个源文件的顶部删除了链接器错误。 但是,我很想知道为什么与 VS2019 相比,使用 VS2012 进行编译会产生另一种行为。

【讨论】:

  • 我确定这不是真的,VS2012 不关心包含顺序。在 C++ 语言中,您必须在使用之前定义事物。如果您必须将 afxwin.h 放在顶部,这一定意味着其中一个包含文件发生了变化。例如,另一个包含文件以前包含 aftwin.h,但现在不再包含它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2011-10-02
相关资源
最近更新 更多