我正在使用VS2010和托管C ++ DLL调用另一个托管C ++ DLL中的函数,并且我收到许多LNK2028个链接错误,看起来像这样。
1>udpPkt.obj : error LNK2028: unresolved token (0A0000AA) "unsigned short __cdecl ComputeCrc16(void const *,unsigned int)" (?ComputeCrc16@@$$FYAGPBXI@Z) referenced in function "public: short __thiscall CPrivateUdpPkt::ComputeCrc(void)const " (?ComputeCrc@CPrivateUdpPkt@@$$FQBEFXZ)
当我在被调用的DLL上使用 dumpbin / export 时,我看到未解析的函数列为:
7 6 00001040 ?ComputeCrc16@@YAGPBXI@Z = ?ComputeCrc16@@YAGPBXI@Z ( unsigned short __cdecl ComputeCrc16(void const *,unsigned int))
将转储中列出的函数原型与错误消息中列出的函数原型进行比较,扩展原型似乎匹配但是受损的名称不匹配。
err ?ComputeCrc16@@$$FYAGPBXI@Z unsigned short __cdecl ComputeCrc16(void const *,unsigned int)
dump?ComputeCrc16@@YAGPBXI@Z unsigned short __cdecl ComputeCrc16(void const *,unsigned int)
在LNK2028链接中,它提到了使用__clrcall调用_cdecl的问题,但它说在调用导出的本机函数时会发生这种情况,但是它没有描述如何解决问题。除了我用/ clr编译被调用的DLL和调用DLL之外,所以调用函数和被调用函数都不应该是我理解的原生函数。
调用代码如下所示
unsigned short __declspec(dllimport) ComputeCrc16(const void * i_pData, size_t i_nBytes);
short CPrivateUdpPkt::ComputeCrc() const
{
const Byte * pByte = reinterpret_cast<const Byte *>(&m_Crc) + sizeof(m_Crc);
size_t len = &m_aData[DataLen()] - pByte;
return ComputeCrc16(pByte, len);
}
被调用的函数如下所示:
unsigned short __declspec(dllexport) ComputeCrc16(const void * i_pData, size_t i_unNumBytes)
{
...
}