未定义的体系结构符号 x86_64 (clang)
Undefined symbols for architecture x86_64 (clang)
我正在尝试使用 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("hash" 函数未识别)。有想法该怎么解决这个吗?
编辑:
事实证明,我正在尝试使用一个不存在的函数 ("hash") - 抱歉误导了您。
但是我仍然遇到同样的问题:包括 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)
您使用的是哪个 SDK,Xcode 是哪个版本? OpenSSL 在 OS X 10.7 中被弃用,并从 Xcode 7 Beta 附带的 10.11 SDK 中删除。单独下载 OpenSSL 应该可行,但您可能需要为新位置更改项目配置。
#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
returns 0 次点击。 man 3 hash
returns 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
后面加上[=36] =]
(EDIT, from comment): I have openssl at /opt/local/include/openssl....
您将遇到更多问题,因为您可能在运行时链接到 错误的 版本的 OpenSSL 库。对于该问题,请参阅 。命令行和 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 和您的程序,以便在运行时加载正确版本的库。为此,请参阅 Stack Overflow 上的 Compilation and Installation | Using RPATHs on the OpenSSL wiki and Build OpenSSL with RPATH?。
我正在尝试使用 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("hash" 函数未识别)。有想法该怎么解决这个吗?
编辑:
事实证明,我正在尝试使用一个不存在的函数 ("hash") - 抱歉误导了您。
但是我仍然遇到同样的问题:包括 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)
您使用的是哪个 SDK,Xcode 是哪个版本? OpenSSL 在 OS X 10.7 中被弃用,并从 Xcode 7 Beta 附带的 10.11 SDK 中删除。单独下载 OpenSSL 应该可行,但您可能需要为新位置更改项目配置。
#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
returns 0 次点击。 man 3 hash
returns 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
后面加上[=36] =]
(EDIT, from comment): I have openssl at /opt/local/include/openssl....
您将遇到更多问题,因为您可能在运行时链接到 错误的 版本的 OpenSSL 库。对于该问题,请参阅
这是最简单的解决方案。请注意,它 不 使用 -lcrypto
(-lfoo
通常是解决方案,除非运行时链接到错误的共享对象成为问题):
clang main.c -I /opt/local/include /opt/local/lib/libcrypto.a -o my_hash.exe
存档只是目标文件的集合,因此可以在需要目标文件的地方使用存档。
OS X 不支持 RPATH
s。 另一种解决方案是使用 RPATH
构建 OpenSSL 和您的程序,以便在运行时加载正确版本的库。为此,请参阅 Stack Overflow 上的 Compilation and Installation | Using RPATHs on the OpenSSL wiki and Build OpenSSL with RPATH?。