2

我正在使用带有托管 C++ DLL 的 VS2010 调用另一个托管 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)
{
...
}
4

0 回答 0