Отображение неопределенной ссылки на определенный объект

Я пытаюсь хешировать несколько строк в своем проекте. И я использую следующий проект, который использует алгоритм 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 должен определяться беззнаковым символом. Пожалуйста помоги.


person VinayJ    schedule 12.05.2011    source источник


Ответы (2)


SHA1.h не включает climits, поэтому ULONG_MAX не определено. Это приводит к проблемам на 32-битных системах.

Скажите #include <climits> где-нибудь в начале файла, и все готово.

person Thorsten    schedule 19.07.2011
comment
Добро пожаловать в StackOverflow. Обязательно ознакомьтесь со справкой по использованию форматирования MarkDown. Потратив время на форматирование вопросов и ответов, вы сделаете их более читабельными и, следовательно, полезными для других. Справа от текстового поля, в которое вы вводите вопросы и ответы, есть удобная ссылка на справку. - person marko; 16.11.2012

Одна вещь, которую вы можете сделать, это использовать типы, определенные в SHA1.h, в вашем собственном коде при объявлении теста, чтобы убедиться, что вы вызываете функцию с правильными типами аргументов.

person dma    schedule 12.05.2011
comment
Вы уверены, что определение не удалено препроцессором #ifdef? - person ognian; 13.05.2011