別のマネージド 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)
呼び出された 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リンクでは、_cdecl が __clrcall で呼び出される問題について言及していますが、エクスポートされたネイティブ関数を呼び出すときにこれが発生すると述べていますが、問題を解決する方法については説明していません。また、呼び出された DLL と呼び出し元の DLL の両方を /clr でコンパイルしているため、呼び出し元または呼び出された関数のどちらも、私の理解ではネイティブではありません。
呼び出しコードは次のようになります
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)
{
...
}