StrTrait类的差异阻止了符号解析?

时间:2016-03-02 15:52:42

标签: c++ mfc exe atl unresolved-external

在新的应用程序MyProg.exe中,我想重新使用另一个dll / lib,MyDll.lib / .dll中定义的函数。这个电话有这个签名:

CString CallToDllCodeFuncFromExe( const CString & someStr );

在MyProg.exe中,我#include dll的头文件并输入MyDll.lib,以便链接器可以解析它,但我得到一个未解析的符号。

MSDN告诉我,发生这种情况的一个原因可能是“使用了一个函数,但参数的类型或数量与函数定义不匹配”。这似乎就是这种情况。下面是从exe错误消息和MyDll.lib的dumpbin中获取的函数的unmangled签名的比较。请注意,StrTraitMFC和StrTraitMFC_DLL之间存在差异,导致其无法解析:

构建MyProg.exe的错误消息(未解析的符号):

__ cdecl CallToDllCodeFuncFromExe(类ATL :: CStringT< wchar_t,类 StrTraitMFC < wchar_t,类ATL :: ChTraitsCRT< wchar_t>>> const&)

为CallToDllCodeFuncFromExe转储/导出MyDll.lib:

__ cdecl CallToDllCodeFuncFromExe(类ATL :: CStringT< wchar_t,类 StrTraitMFC_DLL < wchar_t,类ATL :: ChTraitsCRT< wchar_t>>> const&))

但实际上我注意到有一种解决方法。我需要做的就是模板功能,调用工作正常。这是IntToStr,其中一个令牌模板参数按值:

template< int N > CString IntToStr( int N )
{
  CString intToStr;
  intToStr.Format( L"%d", N );
  return intToStr;
}

电话是:

CString str = IntToStr< 33 >( 33 );

导出的函数如下所示:

类ATL :: CStringT&lt; wchar_t,类StrTraitMFC_DLL&lt; wchar_t,类ATL :: ChTraitsCRT&lt; wchar_t的&GT; &GT; &GT; __cdecl IntToString(int)

我的问题是,为什么这种解决方法有效,为什么非模板化调用不起作用?它只是一个Visual Studio的不一致/错误,还是有更多的C ++摘要在这里发生?

0 个答案:

没有答案