md5引用错误

时间:2013-01-12 17:36:54

标签: c openssl md5

我在我的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

任何帮助实现这一目标的帮助都会很棒!

5 个答案:

答案 0 :(得分:18)

OS X使用古老版本的GNU工具链,而Ubuntu(以及Linux发行版)使用较新版本。这些更新的版本要求按照符号相互依赖的顺序指定对象和库文件。这意味着为了获得最大的可移植性,应始终将库链接器标志放在命令行调用的末尾,,如下所示:

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

答案 1 :(得分:6)

-l放在命令的末尾:

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

答案 2 :(得分:0)

要在eclipse中执行此操作:

在Eclipse中右键单击项目 - &gt; C / C ++构建设置 - &gt;工具设置 - &gt; GCC C Linker - &gt;库,然后在右侧的-l部分添加“ssl”和“crypto”。

Eclipse

答案 3 :(得分:0)

在ubuntu 16.04上我有问题然后我在14.04编译它并且它对我有用

答案 4 :(得分:-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

我的链接开始工作