我正在将 VS2010 与托管 C++ DLL 一起使用,调用另一个托管 C++ DLL 中的函数,并且我得到了很多LNK2028 http://msdn.microsoft.com/en-us/library/ms235590%28v=vs.80%29.aspx链接错误看起来像这样。
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 上,我看到未解析的函数列出为:
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)
In the LNK2028 http://msdn.microsoft.com/en-us/library/ms235590%28v=vs.80%29.aspx链接它提到了使用 __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)
{
...
}