我正在尝试对项目中的几个字符串进行哈希处理。我正在使用以下使用 HAMC SHA1 算法的项目 http://www.codeproject.com/KB/recipes/HMACSHA1class.aspx
经过很多麻烦,我能够编译整个代码。但最后我留下了与 undefined reference 有关的最后一个问题。
我编写了以下代码来调用项目中给出的 HMAC SHA1 类,如下所示
BYTE Key[20] ;
BYTE digest[20] ;
unsigned char *test = (unsigned char *)"Hi There" ;
extern "C" {
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz );
}
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
{
memset(Key, 0x0b, 20) ;
CHMAC_SHA1 HMAC_SHA1 ;
HMAC_SHA1.HMAC_SHA1(test, strlen((const char *)test), Key, sizeof(Key), digest) ;
return env->NewStringUTF("Hello from JNI Sample!");
}
在 HMAC_SHA1.cpp 的以下行中遇到如下错误:
CSHA1::Update((UNIT_8 *)key, key_len);
CSHA1::Update((UNIT_8 *)AppendBuf1, sizeof(m_ipad) + text_len);
CSHA1::Update((UNIT_8 *)AppendBuf2, sizeof(m_opad) + SHA1_DIGEST_LENGTH);
这里我得到一个错误:
Error: undefined reference to 'CSHA1::Update(unsigned char*, unsigned long)'
现在在 SHA1.h 中
我可以看到下面的代码
///////////////////////////////////////////////////////////////////////// //定义 8 位和 32 位变量
#ifndef UINT_32
#ifdef _MSC_VER
#define UINT_8 unsigned __int8
#define UINT_32 unsigned __int32
#else
#define UINT_8 unsigned char
#if (ULONG_MAX == 0xFFFFFFFF)
#define UINT_32 unsigned long
#else
#define UINT_32 unsigned int
#endif
#endif
#endif
////////////////////////////////// 函数声明如下:
// Update the hash value
void Update(UINT_8 *data, UINT_32 len);
我使用的是 windows 环境,但在 cygwin 中编译。
我不确定为什么会出现这样的错误
错误:未定义对“CSHA1::Update(unsigned char*, unsigned long)”的引用
谁能指出问题所在以及如何解决?
我认为 _MSC_VER 有问题,因为它应该是假的,然后 UINT_8 应该由 unsigned char 定义。请帮忙。
最佳答案
SHA1.h
不包括限制,因此 ULONG_MAX
未定义。这会导致 32 位系统出现问题。
说 #include <climits>
在文件顶部的某处,你应该完成了。
关于c++ - 显示对已定义对象的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5979315/