私はOpenSSLが新しく、コンパイルしようとしていますthis exampleドキュメントに見つかりました。次のように例はそのままです:OpenSSL定義されていない参照
#include <stdio.h>
#include <openssl/evp.h>
main(int argc, char *argv[])
{
EVP_MD_CTX *mdctx;
const EVP_MD *md;
char mess1[] = "Test Message\n";
char mess2[] = "Hello World\n";
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len, i;
if (argv[1] == NULL) {
printf("Usage: mdtest digestname\n");
exit(1);
}
md = EVP_get_digestbyname(argv[1]);
if (md == NULL) {
printf("Unknown message digest %s\n", 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 example.c -lssl -lcrypto
そして、私は次の出力を得る:
example.c: In function ‘main’:
example.c:25:7: warning: assignment makes pointer from integer without a cast [enabled by default]
mdctx = EVP_MD_CTX_new();
^
example.c:27:32: warning: incompatible implicit declaration of built-in function ‘strlen’ [enabled by default]
EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
^
/tmp/ccWb0D5B.o: In function `main':
example.c:(.text+0xc4): undefined reference to `EVP_MD_CTX_new'
example.c:(.text+0x151): undefined reference to `EVP_MD_CTX_free'
collect2: error: ld returned 1 exit status
だから私は何のライブラリをしないのですか?私はこれを検索するためにいくつかの時間を費やしましたが、私が見たすべての答えはちょうど-lssl -lcrypto
を使用してのバリエーションです。ありがとう。
欠落している最も明白な#includeはstring.hです。strlenはそれがないとサポートされていないためです。それはあなたの警告の少なくとも1つを抑えるでしょう。そして、あなたは、新しい/無料のバージョンではなく、作成/破棄APIが必要かもしれないと思います。 APIをチェックしてください。 – WhozCraig
あなたはどんな_OpenSSL_バージョンを使用していますか? v1.1.0のインクルードファイルで 'EVP_MD_CTX_new'だけを見ました。 – CristiFati
@CristiFati実際にバージョン管理の問題でした。ソースからコンパイルして解決しました。下記の回答をご覧ください。 – John