MFC/DLL中缺少ATL :: CSTRINGT功能,该功能与Clang/vs-2019构建

Missing ATL::CStringT function in MFC/DLL Builds with Clang/VS-2019

本文关键字:功能 Clang 构建 vs-2019 CSTRINGT ATL MFC DLL      更新时间:2023-10-16

最近在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。或"调试"配置,错误消失了。

使用_atl_insecure_deprecate(" blah blah blah blah&quort"(属性在cstringt.h标题中定义了'有问题的功能,但是将其重新定义为"空"并不能解决问题。

要复制,在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("重建!您需要在生成的"框架"末尾发表或禁用与明显相关的线路。文件:

    #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

so:(1(这是我应该向微软报告的"错误"还是我在做愚蠢的事情?(2(任何人都可以建议一个补丁/修复程序,以便我真正可以用Clang测试我的MFC项目吗?注意:当我依靠扩展DLL时,我必须在DLL中使用MFC。

aha!我有一个可行的修复程序(目前(,但依赖于我构建的EXES都称为常见的DLL,我也构建了这一事实。我将此代码添加到该DLL的来源,现在它们构建和运行!

template<> void __declspec(dllexport) __cdecl ATL::CSimpleStringT<wchar_t,1>::CopyChars(wchar_t *pchDest, size_t, const
    wchar_t *pchSrc, int nChars) throw()
{
    memcpy(pchDest, pchSrc, size_t(nChars) * sizeof(wchar_t));
    return;
}

但是,这取决于我称之为dll的事实。对于其他没有的应用程序,我还无法((都能获得这种工作方法。另外,我的" MFC扩展DLL"似乎不喜欢它:它们是可选的'插件'模块,但在我尝试加载一个模块时,只会导致完整的出口/崩溃 - 但这可能是由许多其他的导致因素,因为这使用了真正深/微妙的MFC东西。

我遇到了同一问题,发现项目配置中的内联函数扩展(/ob0(解决了问题。您是否碰巧启用了它(/ob1或/ob2(?