2011-05-12 71 views
1

我想在我的項目散列弦數。而我正在使用下面的項目,使用HAMC SHA1算法 http://www.codeproject.com/KB/recipes/HMACSHA1class.aspx顯示未定義refrence一個定義的對象

我能夠編譯整個代碼後,很多麻煩。但最後我還剩下最後一個與未定義參考有關的問題。

我已經寫了下面的代碼envoke在如下所示的HMAC_SHA1.cpp以下線,如遇到

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類如下:

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 ::更新(無符號字符*,無符號長)」

任何人都可以請指出是什麼問題以及如何糾正?

我相信成纔是錯_MSC_VER原因應該是假的,然後UINT_8應無符號的字符來定義。請幫忙。

回答

1

一兩件事你可以做的是,宣佈測試時,以確保您正在調用合適的參數類型的函數使用SHA1.h定義的類型在自己的代碼。

+0

我想它太...但它不工作。 – VinayJ 2011-05-12 15:02:07

+0

你確定這個定義沒有被預處理器#define去掉嗎? – ognian 2011-05-13 06:02:36

2

SHA1.h不包括climits,因此ULONG_MAX是未定義的。這導致在32位系統上出現問題。

在文件上說#include <climits>的地方,你應該做的。

+0

歡迎來到StackOverflow。請務必查看使用[MarkDown](http://en.wikipedia.org/wiki/Markdown)格式的幫助。花時間格式化您的問題和答案會使他們更易讀,因此對他人有用。在您輸入問題和答案的文本框右側有一個方便的幫助鏈接。 – marko 2012-11-16 19:04:37