【发布时间】:2015-06-19 13:02:15
【问题描述】:
我正在尝试使用 OpenSSL 从 c 程序计算 sha1 哈希。我正在使用 Intel i7(64 位)在 Mac OS X Yosemite 上使用 clang 进行编译。
相关的代码大致是这样的:
#include <openssl/evp.h>
...
unsigned char outHash[20];
hash("SHA1","abcd", 20, outHash);
问题是,当使用openssl/evp.h 中的“hash”函数时,使用 clang 编译会产生以下错误:
Undefined symbols for architecture x86_64:
"_hash", referenced from:
_getRandomSHA1 in main-68ccd6.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
所以看起来链接器找不到 OpenSSL(“哈希”函数无法识别)。有想法该怎么解决这个吗?
编辑:
事实证明,我试图使用一个不存在的函数(“哈希”) - 很抱歉在这方面误导了您。
但是我仍然遇到同样的问题:包括openssl/evp.h 似乎不起作用。
这是我正在使用的哈希函数,它使用 evp 执行 sha1 编码:
unsigned int hash(const char *mode, const char* dataToHash, size_t dataSize, unsigned char* outHashed) {
unsigned int md_len = -1;
const EVP_MD *md = EVP_get_digestbyname(mode);
if(NULL != md) {
EVP_MD_CTX mdctx;
EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx, md, NULL);
EVP_DigestUpdate(&mdctx, dataToHash, dataSize);
EVP_DigestFinal_ex(&mdctx, outHashed, &md_len);
EVP_MD_CTX_cleanup(&mdctx);
}
return md_len;
}
然后我打电话:
hash("SHA1","abcd", 20, outHash);
我的编译和以前一样,这是我的编译命令(很简单):
clang main.c
我从链接器收到以下错误:
Undefined symbols for architecture x86_64:
"_EVP_DigestFinal_ex", referenced from:
_hash in main-935849.o
"_EVP_DigestInit_ex", referenced from:
_hash in main-935849.o
"_EVP_DigestUpdate", referenced from:
_hash in main-935849.o
"_EVP_MD_CTX_cleanup", referenced from:
_hash in main-935849.o
"_EVP_MD_CTX_init", referenced from:
_hash in main-935849.o
"_EVP_get_digestbyname", referenced from:
_hash in main-935849.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
【问题讨论】:
-
你的编译链接命令是什么?
-
目前只是“clang -Wall main.c”。我在 /opt/local/include/openssl 下有 openssl。我需要以某种方式让 clang 知道这件事吗?
-
嗯,如果我用 -v 运行编译,我看到 clang 正在寻找 /usr/local/include 上的包含,它下面还有 openssl 和 evp.h。所以很奇怪,它仍然无法成功链接
-
查看更新后的答案。这是一个常见的疏忽。
-
我添加了关于静态链接的信息以避免意外的运行时错误。我之前错过了细节,但在你的一个 cmets 中看到了。
标签: c macos openssl clang llvm