显示对已定义对象的未定义引用

时间:2011-05-12 14:12:10

标签: c++ android-ndk unsigned-char

我正在尝试在项目中隐藏一些字符串。我正在使用以下使用HAMC SHA1算法的项目 http://www.codeproject.com/KB/recipes/HMACSHA1class.aspx

我能够在遇到很多麻烦后编译整个代码。但最后我还是留下了与未定义引用相关的最后一期。

我编写了以下代码来调用项目中给出的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定义。请帮忙。

2 个答案:

答案 0 :(得分:2)

SHA1.h不包含攀登,因此ULONG_MAX未定义。这导致32位系统出现问题。

在文件顶部的某处说#include <climits>,你应该完成。

答案 1 :(得分:1)

您可以做的一件事是在声明测试时使用您自己代码中SHA1.h中定义的类型,以确保您使用正确的参数类型调用函数。