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

Posted

技术标签:

【中文标题】显示对已定义对象的未定义引用【英文标题】:Showing undefined reference to a defined object 【发布时间】:2011-05-12 14:12:09 【问题描述】:

我正在尝试在我的项目中散列几个字符串。我正在使用以下使用 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 定义。请帮忙。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

欢迎来到 ***。请务必查看有关使用MarkDown 格式的帮助。花时间格式化您的问题和答案将使它们更具可读性,因此对其他人有用。在您输入问题和答案的文本框右侧有一个方便的帮助链接。【参考方案2】:

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

【讨论】:

你确定定义没有被预处理器#ifdef 删除吗?

以上是关于显示对已定义对象的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

对静态 constexpr 数据成员的未定义引用错误

与代码块一起使用时,使用 Visual Studio 创建的静态库显示对 Myfunction 的未定义引用

对带有数组的构造函数的未定义引用[重复]

对结构方法的未定义引用[重复]

对静态成员的未定义引用

对现有类的未定义引用