问题
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