c++ - 显示对已定义对象的 undefined reference

标签 c++ android-ndk unsigned-char

我正在尝试对项目中的几个字符串进行哈希处理。我正在使用以下使用 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/

相关文章:

android - MuPdf Android JNI 库非常大

c++ - 如何在不导致复制的情况下将 char 数据附加到 std::vector

c - 十六进制枚举或整数(ASCII)枚举来填充字节数组?

c++ - Android NDK 要求在源文件中包含绝对路径

c - 这是整数提升吗?它是如何工作的?

c++ - 在 C++ 中制作一个安全的缓冲区持有者

c++ - SBRM/RAII 用于 std::va_list/va_start()/va_end 使用

c++ - boost::mpl::apply 仅适用于类型化模板参数

c++ - 用于生产服务器的 Wt httpd

android - 我应该将我的 freetype 字体加载器指向哪里?