2017-03-27 236 views
0

私は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を使用してのバリエーションです。ありがとう。

+0

欠落している最も明白な#includeはstring.hです。strlenはそれがないとサポートされていないためです。それはあなたの警告の少なくとも1つを抑えるでしょう。そして、あなたは、新しい/無料のバージョンではなく、作成/破棄APIが必要かもしれないと思います。 APIをチェックしてください。 – WhozCraig

+0

あなたはどんな_OpenSSL_バージョンを使用していますか? v1.1.0のインクルードファイルで 'EVP_MD_CTX_new'だけを見ました。 – CristiFati

+0

@CristiFati実際にバージョン管理の問題でした。ソースからコンパイルして解決しました。下記の回答をご覧ください。 – John

答えて

2

@john!

あなたのコンピュータにはOpenSSLライブラリのバージョンがインストールされており、現在のOpenSSLライブラリと互換性のないファイルが含まれている可能性があります。

EVP_MD_CTX_new()があなたのヘッダファイルに見つかりませんでした、そして整数を返す関数とみなされていることを警告

example.c:25:7: warning: assignment makes pointer from integer without a cast [enabled by default] 

信号、C.

のデフォルトの動作やエラーexample.c:(.text+0xc4): undefined reference to EVP_MD_CTX_new ''

は、EVP_MD_CTX_new()がOpenSSLライブラリにないことを通知します。

おそらく、あなたのOpenSSLの例は、あなたがコンパイルしようとしているOpenSSLのサンプルファイルよりも新しい(または古い)かもしれません。

あなたのサンプルがあなたのライブラリとヘッダーファイルより新しいと仮定すると、通常の解決策は、更新されたOpenSSLを得るために、ソースファイルをダウンロードして再コンパイルすることです。

もう1つの可能性は逆です。新しいOpenSSLがあり、その例は古いものに属しています。その場合は、新しい例を見つけなければなりません。

したがって、関連するすべてのファイルのバージョンを確認する必要があります。

幸運を祈る!

+0

ありがとう、あなたは間違いなくその頭の釘を打つ。私はソースからコンパイルして、今はすべて正常です。 – John

関連する問題