md5 reference error

落花浮王杯 提交于 2019-12-07 04:44:58

问题


I had a correctly working md5 program compiled on my mac but when I try to compile on my ubuntu distro it errors out saying:

 /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

Below is my code for 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;
}

Here is my "md5.h" file just contains the str2md5 function:

#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;
} 

I have tried to compile it with all the -l things I have found on the internet. For example:

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

Any help to get this to work would be amazing!


回答1:


OS X uses an ancient version of the GNU toolchain, whereas Ubuntu (and Linux distros in general) uses a newer one. These more recent versions require that the object and library files be specified in the order their symbols depend on each other. It means that for maximum portability, you should always put the library linker flags to the end of the command line invocation, like this:

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



回答2:


Put -l at the end of your command:

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



回答3:


To do this in eclipse:

Right Click Project in Eclipse-> C/C++ Build Settings -> Tool Settings -> GCC C Linker -> Libraries and then add "ssl" and "crypto" in the -l section on the right.




回答4:


on ubuntu 16.04 i was having issues then i compiled it on 14.04 and it worked for me




回答5:


Sometimes, proper symbolic link may be needed:

My initial system file:

-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

Only after I have added the symbolic link

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

My linking started to work



来源:https://stackoverflow.com/questions/14295980/md5-reference-error

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!