gpt4 book ai didi

c++ - 使用 Clang/VS-2019 构建的 MFC/DLL 中缺少 ATL::CStringT 函数

转载 作者:行者123 更新时间:2023-11-28 04:12:51 30 4
gpt4 key购买 nike

最近在 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 header 中使用 _ATL_INSECURE_DEPRECATE("blah blah") 属性定义,但将其重新定义为“空”并不能解决问题。

要重现,请使用“新建项目”向导在 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”文件末尾注释掉或禁用与 list 相关的行:

    #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

我在我的全局 header 中尝试了以下#defines,但无济于事:

    #define _CRT_SECURE_NO_DEPRECATE
#define _SECURE_ATL 0
#define _SECURE_SCL 0
#define _ATL_INSECURE_DEPRECATE(a)
#define _ATL_DEBUG_INTERFACES

所以:(1) 这是我应该向 Microsoft 报告的“错误”还是我在做一些愚蠢的事情? (2) 任何人都可以建议补丁/修复,以便我可以真正用 clang 测试我的 MFC 项目吗?注意:我必须在 DLL 中使用 MFC,因为我依赖于扩展 DLL。

最佳答案

啊哈!我有一个有效的修复程序(目前),但依赖于我正在构建的所有 EXE 都调用我也构建的公共(public) 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 Extension DLLs”似乎不喜欢它:它们是可选的“插件”模块,但当我尝试加载一个模块时只会导致完全退出/崩溃 - 但这可能是由许多其他原因引起的因素,因为这使用了非常深入/微妙的 MFC 内容。

关于c++ - 使用 Clang/VS-2019 构建的 MFC/DLL 中缺少 ATL::CStringT 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57308559/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com