【问题标题】:md5 reference errormd5 参考错误
【发布时间】:2012-12-27 02:05:06
【问题描述】:

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

下面是我的 main 代码:

#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

任何帮助使它工作的帮助都将是惊人的!

【问题讨论】:

  • 那是你的 md5.h header ??嗯。
  • @WhozCraig 这是什么意思?我做错了吗?
  • 在你的标题中看到一个函数 definition 真是奇怪,这个地方通常用于 declarations,尤其是没有inline 序言。它会像你一样工作,因为它只包含在一个源文件中,但是一旦你将它拉入模块的其他源文件中(如果你添加了多个包含 md5.h 的 .c 文件header)你会从你的链接器中得到重复的符号错误。
  • @WhozCraig 啊,好吧。我明白你的意思。我很好奇你会把你的定义放在哪里?我还在学习,很想得到建议。

标签: c openssl md5


【解决方案1】:

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

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

【讨论】:

  • 谢谢。 gcc -Wall md5.c -o md5 -lcrypto -lssl -lz 为我工作。
【解决方案2】:

-l 放在命令的末尾:

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

【讨论】:

    【解决方案3】:

    在 Eclipse 中执行此操作:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        我的初始系统文件:

        -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

        我的链接开始起作用了

        【讨论】:

          猜你喜欢
          • 2013-08-15
          • 2013-02-11
          • 2015-07-30
          • 2018-03-12
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多