【发布时间】: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? https://docs.microsoft.com/en-us/cpp/atl/reference/iatlmemmgr-class?redirectedfrom=MSDN&view=vs-2019
-
添加了 atlmem.h 和 atlsimpstr.h,但仍然有错误。我开始相信这些符号应该在 atls.lib 中,但无论出于何种原因,它们都不是。
-
我建议您可以尝试添加
atls.lib。根据DOC.When 项目引用了库 (.LIB) 或对象 (.OBJ) 文件,而该文件又需要来自另一个库的符号。即使您不调用导致依赖的函数,它也可能发生。要解决此问题,请将对其他库的引用添加到您的项目中。
标签: mfc linker-errors visual-studio-2019 atl