gpt4 book ai didi

c - 架构 x86_64 (clang) 的 undefined symbol

转载 作者:行者123 更新时间:2023-12-05 00:59:17 37 4
gpt4 key购买 nike

我正在尝试使用 OpenSSL 从 c 程序计算 sha1 哈希。我正在 Mac OS X Yosemite 上使用 Intel i7(所以 64 位)使用 clang 进行编译。

相关的一段代码大致如下:

#include <openssl/evp.h>
...
unsigned char outHash[20];
hash("SHA1","abcd", 20, outHash);

问题是,当使用来自 openssl/evp.h 的“散列”函数时, 用 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)

最佳答案

#include <openssl/evp.h>
...
unsigned char outHash[20];
hash("SHA1","abcd", 20, outHash);

OpenSSL 没有 int hash(...)char* hash(...)功能。 $ cat /usr/include/openssl/evp.h | grep hash返回 0 次点击。 man 3 hash返回 BSD 的“哈希数据库访问方法”。

Undefined symbols for architecture x86_64:
"_hash", referenced from:
_getRandomSHA1 in main-68ccd6.o

锁定 _getRandomSHA1 ,有一个 SHA功能,但它可以从 sha.h 获得,而不是 evp.h (我过滤掉了 DEPRECATED_IN... 宏):
$ cat /usr/include/openssl/sha.h | grep SHA | grep char
...
unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md);
...
我相信它使用静态缓冲区,不鼓励使用它。
项目推荐使用 EVP Message Digests现在的界面。

(EDIT): I am compiling same as before, this is my compile command(pretty simple):
clang main.c


Linking OpenSSL libraries to a program .您需要添加 -lcrypto 到编译命令的末尾。

(EDIT, from comment): I have openssl at /opt/local/include/openssl....


您将遇到更多问题,因为您可能正在运行时链接到错误版本的 OpenSSL 库。有关该问题,请参阅 Statically link OpenSSL in XCode .命令行和 Xcode 也存在同样的问题。
这是最简单的解决方案。请注意它 使用 -lcrypto ( -lfoo 通常是解决方案,除非运行时链接到错误的共享对象成为问题):
 clang main.c -I /opt/local/include /opt/local/lib/libcrypto.a -o my_hash.exe 
文件只是目标文件的集合,因此可以在需要目标文件的地方使用文件。
OS X 不尊重 RPATH s。另一种解决方案是使用 RPATH 构建 OpenSSL 和您的程序。所以在运行时加载正确版本的库。为此,请参阅 Compilation and Installation | Using RPATHs在 OpenSSL wiki 和 Build OpenSSL with RPATH? 上在堆栈溢出上。

关于c - 架构 x86_64 (clang) 的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30938866/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com