0

我收到以下链接器错误

error LNK2019: unresolved external symbol "class ATL::CStringT<unsigned short,class StrTraitMFC_DLL<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > __cdecl myjb::GetLocalAppPath(class ATL::CStringT<unsigned short,class StrTraitMFC_DLL<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &)" (?GetLocalAppPath@myjb@@YA?AV?$CStringT@GV?$StrTraitMFC_DLL@GV?$ChTraitsCRT@G@ATL@@@@@ATL@@ABV23@@Z) referenced in function "private: void __thiscall inmessage::init_service_thread(void)" (?init_service_thread@inmessage@@AAEXXZ)

我有以下方法

void inmessage::init_service_thread()
{
   std::string appDataFName = (CT2CA) myjb::GetLocalAppPath("");
}

现在 GetLocalAppPath 是来自外部库的函数。关于可能出现问题或链接器错误原因的任何建议?

4

2 回答 2

0

可能的原因是外部 dll 没有实现 GetLocalAppPath。而如果GetLocalAppPath接口的定义不是PURE虚函数,也会导致同样的链接错误。

于 2013-11-14T02:26:58.007 回答
0

您使用宏的方式会阻止宏被扩展。一个宏只有在它后面跟着一个开头时才会被扩展(

(CT2CA) myjb::GetLocalAppPath("");

这行代码防止宏被扩展。这也是一件好事,因为它几乎只是看起来起作用,纯属偶然。

改用这个:

CT2CA( myjb::GetLocalAppPath("").GetString() );

当然,这是假设它GetLocalAppPath是命名空间中的函数myjb或 class 的静态函数myjb。无论哪种方式,您都在尝试使用__cdecl调用约定导入它。确保这与导出的调用约定匹配。

于 2013-11-14T17:01:45.593 回答