7

Macで正しく動作するmd5プログラムをコンパイルしましたが、ubuntuディストリビューションでコンパイルしようとすると、次のようにエラーが発生します。

 /tmp/ccKBJiV3.o: In function `str2md5':
 md5.c:(.text+0x33): undefined reference to `MD5_Init'
 md5.c:(.text+0x5b): undefined reference to `MD5_Update'
 md5.c:(.text+0x79): undefined reference to `MD5_Update'
 md5.c:(.text+0xa2): undefined reference to `MD5_Final'
 collect2: ld returned 1 exit status

以下はメインの私のコードです:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "md5.h"
#include <openssl/md5.h>
#include <openssl/hmac.h>

int main(int argc, char *argv[]) 
{
char *output = str2md5(argv[1], strlen(argv[1]));
printf("%s\n", output);
free(output);
return 0;
}

これが私の「md5.h」ファイルで、str2md5 関数だけが含まれています。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(__APPLE__)
#  define COMMON_DIGEST_FOR_OPENSSL
#  include <CommonCrypto/CommonDigest.h>
#  define SHA1 CC_SHA1
#else
#  include <openssl/md5.h>
#endif

char *str2md5(const char *str, int length) {
int n;
MD5_CTX c;
unsigned char digest[16];
char *out = (char*)malloc(33);

MD5_Init(&c);

while (length > 0) {
    if (length > 512) {
        MD5_Update(&c, str, 512);
    } else {
        MD5_Update(&c, str, length);
    }
    length -= 512;
    str += 512;
}

MD5_Final(digest, &c);

for (n = 0; n < 16; ++n) {
    snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int)digest[n]);
}

return out;
} 

インターネットで見つけたすべての -l を使用してコンパイルしようとしました。例えば:

 gcc -Wall -lcrypto -lssl md5.c -o md5

これを機能させるための助けは素晴らしいでしょう!

4

5 に答える 5

21

OS X は古いバージョンの GNU ツールチェーンを使用しますが、Ubuntu (および一般的な Linux ディストリビューション) は新しいバージョンを使用します。これらの最近のバージョンでは、シンボルが相互に依存する順序でオブジェクト ファイルとライブラリ ファイルを指定する必要があります。これは、移植性を最大限に高めるために、次のように、常にコマンド ライン呼び出しの最後にライブラリ リンカー フラグを配置する必要があることを意味します。

gcc -Wall md5.c -o md5 -lcrypto -lssl
于 2013-01-12T17:39:53.623 に答える
7

コマンド-lの最後に次のように入力します。

gcc -Wall md5.c -o md5 -lcrypto -lssl
于 2013-01-12T17:38:26.610 に答える
0

日食でこれを行うには:

Eclipse で Project を右クリック -> C/C++ Build Settings -> Tool Settings -> GCC C Linker -> Libraries を右クリックし、右側の -l セクションに「ssl」と「crypto」を追加します。

エクリプス

于 2016-06-02T08:16:43.693 に答える