最近在 Visual Studio 2019 中安装了新的 LLVM/clang-cl 工具集,这可能是一个出色的补充!但是,在构建我的 EXE 和 DLL 文件时,我在链接时收到以下错误:
lld-link : error : undefined symbol: "__declspec(dllimport) public: static void __cdecl ATL::CSimpleStringT<wchar_t, 1>::CopyChars(wchar_t *, unsigned __int64, wchar_t const *, int)" (__imp_?CopyChars@?$CSimpleStringT@_W$00@ATL@@SAXPEA_W_KPEB_WH@Z)
只有在使用“在共享 DLL 中使用 MFC”和在“发布”配置中构建时才会发生这种情况:即,使用“在静态库中使用 MFC”或在“调试”配置中,错误就会消失。
'违规函数在 cstringt.h 标头中使用 _ATL_INSECURE_DEPRECATE("blah blah") 属性定义,但将其重新定义为 'empty' 并不能解决问题。
要重现,请使用新建项目向导在 VS-2019 中创建一个默认的 MFC、基于对话框的应用程序,并在 OnInitDialog() 函数中添加以下内容:
// TODO: Add extra initialization here
CString txt1 = L"Hello, ";
CString txt2 = L"world!";
CString mess = txt1 + txt2;
SetDlgItemText(IDC_STATIC, mess);
构建为默认检查,然后将“平台工具集”切换到“LLVM(clang-cl)”并重建!您需要在生成的“framework.h”文件末尾注释掉或禁用与清单相关的行:
#ifndef __clang__
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif
#endif
我在全局标题中尝试了以下#defines,但无济于事:
#define _CRT_SECURE_NO_DEPRECATE
#define _SECURE_ATL 0
#define _SECURE_SCL 0
#define _ATL_INSECURE_DEPRECATE(a)
#define _ATL_DEBUG_INTERFACES
所以:(1)这是我应该向微软报告的“错误”还是我在做一些愚蠢的事情?(2) 任何人都可以建议一个补丁/修复程序,以便我可以用 clang 真正测试我的 MFC 项目吗?注意:我必须在 DLL 中使用 MFC,因为我依赖扩展 DLL。