将挑战与gcc和加密库联系起来

将挑战与gcc和加密库联系起来,gcc,openssl,Gcc,Openssl,我正在尝试用opneSSL编译示例应用程序,我无法让链接器配合。需要一双新的眼睛来看待这个可能很简单的问题。请帮忙 我试着把所有的问题通读一遍,却找不出有什么不对。下面是命令行和链接器输出 $ gcc -t -I/usr/include/openssl -L/usr/lib/x86_64-linux-gnu -o algotest -lcrypto -lssl3 -lssl algotest.c /usr/bin/ld: mode elf_x86_64 /usr/lib/gcc/x86_64

我正在尝试用opneSSL编译示例应用程序,我无法让链接器配合。需要一双新的眼睛来看待这个可能很简单的问题。请帮忙

我试着把所有的问题通读一遍,却找不出有什么不对。下面是命令行和链接器输出

$ gcc  -t -I/usr/include/openssl -L/usr/lib/x86_64-linux-gnu -o algotest -lcrypto -lssl3 -lssl algotest.c

/usr/bin/ld: mode elf_x86_64
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o
/usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o
-lcrypto (/usr/lib/x86_64-linux-gnu/libcrypto.so)
-lssl3 (/usr/lib/x86_64-linux-gnu/libssl3.so)
-lssl (/usr/lib/x86_64-linux-gnu/libssl.so)
/tmp/ccSLR6rb.o
-lgcc_s (/usr/lib/gcc/x86_64-linux-gnu/4.6/libgcc_s.so)
/lib/x86_64-linux-gnu/libc.so.6
(/usr/lib/x86_64-linux-gnu/libc_nonshared.a)elf-init.oS
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
-lgcc_s (/usr/lib/gcc/x86_64-linux-gnu/4.6/libgcc_s.so)
/usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o/tmp/ccSLR6rb.o: In function `main':
algotest.c:(.text+0x5c): undefined reference to `OpenSSL_add_all_digests'
algotest.c:(.text+0x99): undefined reference to `EVP_get_digestbyname'
algotest.c:(.text+0xdc): undefined reference to `EVP_MD_CTX_create'
algotest.c:(.text+0xfb): undefined reference to `EVP_DigestInit_ex'
algotest.c:(.text+0x13b): undefined reference to `EVP_DigestUpdate'
algotest.c:(.text+0x17b): undefined reference to `EVP_DigestUpdate'
algotest.c:(.text+0x192): undefined reference to `EVP_DigestFinal_ex'
algotest.c:(.text+0x19e): undefined reference to `EVP_MD_CTX_destroy'
/usr/bin/ld: link errors found, deleting executable `algotest'
collect2: ld returned 1 exit status
这是源代码

#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>

main(int argc, char *argv[])
{
EVP_MD_CTX *mdctx;
const EVP_MD *md;
char mess1[] = "Test Messagen";
char mess2[] = "Hello Worldn";
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len, i;

OpenSSL_add_all_digests();

if(!argv[1]) {
printf("Usage: mdtest digestnamen");
exit(1);
}

md = EVP_get_digestbyname(argv[1]);

if(!md) {
printf("Unknown message digest %sn", argv[1]);
exit(1);
}

mdctx = EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
EVP_DigestUpdate(mdctx, mess2, strlen(mess2));
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_destroy(mdctx);

printf("Digest is: ");
for(i = 0; i < md_len; i++) printf("%02x", md_value[i]);
printf("n");
}
#包括
#包括
#包括
main(int argc,char*argv[])
{
EVP_MD_CTX*mdctx;
工程执行副总裁(总经理)总经理(总经理);;
char mess1[]=“测试消息n”;
char mess2[]=“Hello Worldn”;
无符号字符md_值[EVP_MAX_md_SIZE];
国际海事局;
OpenSSL_添加_所有_摘要();
如果(!argv[1]){
printf(“用法:mdtest digestname”);
出口(1);
}
md=EVP_get_digestbyname(argv[1]);
如果(!md){
printf(“未知消息摘要%sn”,argv[1]);
出口(1);
}
mdctx=EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx,md,NULL);
执行副总裁DigestUpdate(mdctx、mess1、strlen(mess1));
执行副总裁DigestUpdate(mdctx、mess2、strlen(mess2));
执行副总裁(mdctx、md值和md长度);
执行副总裁MD CTX销毁(mdctx);
printf(“摘要是:”);
对于(i=0;i
$gcc-t-I/usr/include/openssl-L/usr/lib/x86_64-linux-gnu-o algotest-lcrypto-lssl3-lssl algotest.c

尝试:

由于您使用的是
#include
,因此您可以:

$ gcc algotest.c -o algotest -lssl  -lcrypto
此外,请确保已安装OpenSSL的开发版本。在Ubuntu上,命令是:

$ sudo apt-get install libssl-dev
$ sudo yum install openssl-devel
关于Fedora,我相信命令是:

$ sudo apt-get install libssl-dev
$ sudo yum install openssl-devel

我发现了问题!这归功于@Marc指出了这一点。C文件应该在-l文件之前。

是否按正确的顺序放置
-l
标志?(A在B之前,如果A依赖于B,尤其是.c文件在任何文件之前-l)噢,我的天哪,就是这样。我必须把.c放在-l之前!!!谢谢。是的,我已经安装了libssl-dev,并尝试重新订购。不起作用。我接受这个答案,因为它包含所有元素(包括我下面的错误),重要的是
-l
标志的位置,而不是C文件。请参阅上的手册页。