c语言 - OpenSSL 链接未定义的引用'EVP_MD_CTX_new'和'...fre'



我正在尝试使用openssl库提供的哈希算法。我已经安装了openssl和libssl-dev。版本为 1.1.0f。我尝试运行 openssl.org 站点的示例代码:

#include <stdio.h>
#include <openssl/evp.h>
int main(int argc, char *argv[]){
EVP_MD_CTX *mdctx;
const EVP_MD *md;
char mess1[] = "Test Messagen";
char mess2[] = "Hello Worldn";
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len, i;
if(!argv[1]) {
    printf("Usage: mdtest digestnamen");
    exit(1);
 }
md = EVP_get_digestbyname(argv[1]);
if(!md) {
    printf("Unknown message digest %sn", argv[1]);
    exit(1);
}
mdctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
EVP_DigestUpdate(mdctx, mess2, strlen(mess2));
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_free(mdctx);
printf("Digest is: ");
for (i = 0; i < md_len; i++)
    printf("%02x", md_value[i]);
printf("n");
exit(0);
}

我尝试用以下方法编译它:

 gcc digest_example.c -lcrypto -lssl

编译器给出错误:

digest_example.c:(.text+0xbc): undefined reference to `EVP_MD_CTX_new'
digest_example.c:(.text+0x138): undefined reference to `EVP_MD_CTX_free'
collect2: error: ld returned 1 exit status

老实说,我一无所知。我通过编译从网站上安装和重新安装了 OpenSSL 2 次。此外,所有其他命令都没有问题。就这两个。链接时我必须使用其他库吗?

感谢您的帮助。

您似乎使用的是旧版本的openssl(<1.1.0)。也许您已经下载并安装了较新版本,但您的链接器似乎找到并使用了较旧版本的 openssl 库。

1.1.0 中的EVP_MD_CTX_new()已取代 1.0.x 中的EVP_MD_CTX_create()

1.1.0 中的EVP_MD_CTX_free()已替换 1.0.x 中的EVP_MD_CTX_destroy()

您可以尝试使用这些函数的旧版本,或者确保您的链接器确实使用 openssl 库的>= 1.1.0 版本。

版本为 1.1.0f。我尝试运行 openssl.org 站点的示例代码...

我通过编译从网站上安装和重新安装了 OpenSSL 2 次......

我相信OpenSSL 1.1.0可以安装到/usr/local/ssl中。标头位于 /usr/local/ssl/include,库位于 /usr/local/ssl/lib 。您需要编译并链接到:

gcc -I /usr/local/ssl digest_example.c -Wl,-L,/usr/local/lib -lssl -lcrypto

事实上,由于 Linux 路径是错误的,因此您需要添加一个 RPATH,以便在运行时(而不是编译时)链接到正确的库。所以你真的需要以下内容,因为 Linux 在 30 年左右之后仍然无法正确处理它:

gcc -I /usr/local/ssl digest_example.c -Wl,-rpath,/usr/local/lib -Wl,-L,/usr/local/lib -lssl -lcrypto

您仍然需要正确获取库的顺序,因为 LD 是单传递链接器。

您的命令与系统的 OpenSSL 版本(即 1.0.2)相关联。

 gcc digest_example.c -lcrypto -lssl

然而,图书馆的顺序是错误的。库应该被称为-lssl -lcrypto

最新更新