我使用的是与托管C ++ DLL调用另一个托管C ++ DLL函数,我得到许多VS2010 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)
当我使用DUMPBIN /出口上调用的DLL我看到列为未解决的功能:
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链接它提到的问题_cdecl被称为与__clrcall但它说这个调用导出的本地函数时会发生,但它并没有描述如何解决这个问题。 再说我编译无论是调用的DLL和使用/ clr主叫或被叫功能应该是原产于我的理解,这样既不调用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)
{
...
}