ATL Trace 中定义的类别过多

Posted

技术标签:

【中文标题】ATL Trace 中定义的类别过多【英文标题】:Too many categories defined in ATL Trace 【发布时间】:2014-08-29 21:47:29 【问题描述】:

我将一个项目从 VS2012 升级到 VS2013,发布版本正常工作,但调试版本在断言上失败。

main 之前,我慢慢看着RegisterCategory 超过了最大类别数。逐步通过调试器,它们似乎都是合理命名的类别,然后事情就无法通过断言。

令人困惑的是,atltrace.h 中的函数(如下所示)似乎被多次调用。对于不同的函数地址,我想如果不是 32 限制,这不会是一个问题。

__declspec(selectany) CTraceCategoryEx<CTraceCategoryEx<>::TraceISAPI> atlTraceISAPI(_T("atlTraceISAPI"));

怎么了?我可以禁用 atltrace 吗?

static void RegisterCategory(_In_z_ LPCTSTR pszCategory, unsigned int nCategory)
    
        if (pszCategory == nullptr)
        
            return;
        

        if (m_nLastCategory >= MaxCategoryArray) 
        
            ATLASSERT(false && "Too many categories defined");
            return;
        

        m_nMap[m_nLastCategory].nCategory = nCategory;
#ifdef _UNICODE
        wcscpy_s(m_nMap[m_nLastCategory].categryName, MaxLengthOfCategoryName - 1, pszCategory);
#else
        wchar_t buffer[MaxLengthOfCategoryName] =  0 ;    
        swprintf_s(buffer, MaxLengthOfCategoryName - 1, L"%S", pszCategory);
        wcscpy_s(m_nMap[m_nLastCategory].categryName, MaxLengthOfCategoryName - 1, buffer);
#endif

        m_nLastCategory++;
    

链接器 2012(工作)

/OUT:"C:\Users\kandel\Desktop\obfuscated\x64\Debug\\mine.exe" /MANIFEST /NXCOMPAT /PDB:"C:\Users\kandel\Desktop\obfuscated\x64\Debug\mine.pdb" /DYNAMICBASE "C:\Users\kandel\Desktop\fslim\\glew\glew-1.9.0\lib\glew32.lib" "C:\Users\kandel\Desktop\fslim\\glew\glew-1.9.0\lib\glew32mx.lib" "C:\Users\kandel\Desktop\fslim\\Andor SDK3\atcorem.lib" "BNSPCIeBoard.lib" "cudart.lib" "cuda.lib" "WINMM.lib" "libgmp-10.lib" "libtiff.lib" "qtmaind.lib" "Qt5Cored.lib" "Qt5Guid.lib" "Qt5OpenGLd.lib" "Qt5PrintSupportd.lib" "opengl32.lib" "glu32.lib" "Qt5Widgetsd.lib" "opencv_core300d.lib" "opencv_cuda300d.lib" "opencv_cudaarithm300d.lib" "opencv_cudaimgproc300d.lib" /DEBUG /MACHINE:X64 /PGD:"C:\Users\kandel\Desktop\obfuscated\x64\Debug\mine.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"x64\Debug\SLIM4.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"C:\Qt\5.2.1\msvc2012_64_opengl\lib" /LIBPATH:"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\lib\x64" /TLBID:1 

VS 2013 不工作

/OUT:"C:\Users\QLI\Desktop\obfuscated\x64\Debug\\mine.exe" /MANIFEST:NO /NXCOMPAT /PDB:"C:\Users\QLI\Desktop\obfuscated\x64\Debug\mine.pdb" /DYNAMICBASE "C:\Users\QLI\Desktop\obfuscated\\Andor SDK3\atcorem.lib" "BNSPCIeBoard.lib" "cudart.lib" "cuda.lib" "WINMM.lib" "libgmp-10.lib" "libtiff.lib" "qtmaind.lib" "Qt5Cored.lib" "Qt5Guid.lib" "Qt5OpenGLd.lib" "Qt5PrintSupportd.lib" "opengl32.lib" "glu32.lib" "Qt5Widgetsd.lib" "opencv_core300d.lib" "opencv_cuda300d.lib" "opencv_cudaarithm300d.lib" "opencv_cudaimgproc300d.lib" /DEBUG /MACHINE:X64 /PGD:"C:\Users\QLI\Desktop\obfuscated\x64\Debug\mine.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"x64\Debug\mine.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"C:\Qt\Qt5.3.1\5.3\msvc2013_64_opengl\lib" /LIBPATH:"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\lib\x64" /TLBID:1 

这两者之间的主要区别在于,在 VS2012 中我可以选择 no atl 并且一切运行良好/正确,而在 VS2013 中我不能选择此选项。

--编辑--

我删除了除 Qt 和 CUDA 之外的所有外部库。注意到从预编译头文件中删除 #include &lt;afxwin.h&gt; 会使问题消失,尽管我需要使用 afxwin.h...

【问题讨论】:

你以某种方式破坏了 __declspec(selectany)。顺便说一句,英特尔的 ICC 存在一个已知问题。您的链接器设置肯定是相关的。 @HansPassant 感谢您的回复,我正在使用 VS 进行链接。我想知道selectany 在您同时拥有调试和发布 dll 时如何选择要加载的库? 【参考方案1】:

我可以通过将我的代码的afx 部分移动到一个 dll 中并删除标题来解决这个问题。为什么这个功能在 VS 版本之间发生变化是一个挥之不去的问题。我只能通过更改可以注册的最大数量来断定 MS 破坏了我的代码。

【讨论】:

以上是关于ATL Trace 中定义的类别过多的主要内容,如果未能解决你的问题,请参考以下文章

使用 ATL 的 IDL 导出在 winbase.h 中定义的结构

ATL中宏定义offsetofclass的分析

未定义符号:ATL_chemv

错误:MFC 项目无法定义 _ATL_NO_EXCEPTIONS

[WTL/ATL]_[中级]_[自定义TrackBar]

[WTL/ATL]_[中级]_[自定义TrackBar]