私はopensslライブラリによって提供されるハッシュアルゴリズムを使用しようとしています。 私はopensslとlibssl-devをインストールしました。バージョンは1.1.0fです。 私はopenssl.orgサイトのサンプルコードを実行しよう:OpenSSL未定義の参照 'EVP_MD_CTX_new'と '... fre'のリンク
#include <stdio.h>
#include <openssl/evp.h>
int 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]) {
printf("Usage: mdtest digestname\n");
exit(1);
}
md = EVP_get_digestbyname(argv[1]);
if(!md) {
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 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をコンパイルしてWebサイトから2回インストールして再インストールしました。さらに、他のすべてのコマンドは問題ありません。これらの2つだけ。リンクするときに他のライブラリを使用する必要がありますか?
ありがとうございました。
'gcc digest_example.c -lssl -lcrypto'を使用してください。***ではなく、' gcc digest_example.c -lcrypto -lssl'です。 LDはシングルパスリンカーです。 'libssl'は' libcrypto'に依存するので、 'libcrypto'は' libssl'の後ろにある必要があります。別の方法は '--start-group --end-group'リンカオプションを使うことです。また、['ld(1)'](https://linux.die.net/man/1/ld)のマニュアルページも参照してください。 –
jww
-lssl ans -lcryptoの順番では動作しませんでした。私は何の違いもなくそれらを切り替えました。リンカーとヘッダーはOpenSSLのさまざまなライブラリを使用していたようです。 –
OpenSSL 1.1.0ヘッダーとライブラリがマシン上にある場合の状態。注:私が知っているすべてのディストリビューションは、OpenSSL 1.0.2を提供しています。 OpenSSL 1.1.0ではありません。 – jww