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 中执行此操作:

在 Eclipse 中右键单击 Project -> C/C++ Build Settings -> Tool Settings -> GCC C Linker -> Libraries 然后在右侧的 -l 部分添加“ssl”和“crypto”。

蚀

于 2016-06-02T08:16:43.693 回答
0

在 ubuntu 16.04 上我遇到了问题,然后我在 14.04 上编译了它,它对我有用

于 2018-02-20T11:01:32.740 回答
-1

有时,可能需要正确的符号链接:

我的初始系统文件:

-rwxr-xr-x. 1 root root 1408384 Jun  5  2014 libcrypto.so.0.9.8e
lrwxrwxrwx. 1 root root      19 Sep 22  2015 libcrypto.so.10 ->     libcrypto.so.1.0.1e
-rwxr-xr-x. 1 root root 1965856 Jul 23  2015 libcrypto.so.1.0.1e
lrwxrwxrwx. 1 root root      19 Sep 22  2015 libcrypto.so.6 ->    libcrypto.so.0.9.8e
lrwxrwxrwx. 1 root root      25 Sep 25  2015 libcrypt.so -> ../../lib64/libcrypt.so.1

只有在我添加了符号链接之后

sudo ln -s libcrypto.so.1.0.1e libcrypto.so

我的链接开始工作

于 2016-08-12T22:34:40.397 回答