我在我的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
任何帮助实现这一目标的帮助都会很棒!
答案 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”。
答案 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
我的链接开始工作