在新的应用程序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 ++摘要在这里发生?