问题描述
|
我无法编译以下代码。我在终端中使用以下命令在MACOSX中运行它:
$ gcc filename.c -lssl
我知道MACOS已经具有内置的openssl(我可以在终端中作为命令来调用)。但是我不确定我是否以正确的方式将其链接到库。
#include <stdio.h>
#include <openssl/evp.h>
main(int argc,char *argv[])
{
EVP_MD_CTX mdctx;
const EVP_MD *md;
char mess1[] = \"Test Message\\n\";
char mess2[] = \"Hello World\\n\";
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len,i;
OpenSSL_add_all_digests();
if(!argv[1]) {
printf(\"Usage: mdtest digestname\\n\");
exit(1);
}
md = EVP_get_digestbyname(argv[1]);
if(!md) {
printf(\"UnkNown message digest %s\\n\",argv[1]);
exit(1);
}
EVP_MD_CTX_init(&mdctx);
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_cleanup(&mdctx);
printf(\"Digest is: \");
for(i = 0; i < md_len; i++) printf(\"%02x\",md_value[i]);
printf(\"\\n\");
}
我的错误是:
未定义的符号:
\“ _ EVP_MD_CTX_cleanup \”,引用自:ccfZG7WJ.o中的_main
ld:找不到符号
collect2:ld返回1退出状态
这个错误让我感到惊讶,因为它显示的是\“ Undefined Symbols \”而不是\“找不到头文件\”。您能帮我调试这个问题吗?
谢谢!
解决方法
OpenSSL有2个库:
libssl
和libcrypto
。也包括libcrypto。
gcc filename.c -lssl -lcrypto
(对于该程序,您实际上根本不需要-lssl
,但是包含它也没有什么坏处)
libssl用于建立实际的SSL或TLS连接,例如使用https连接到Web服务器时。它还导出SSL_load_error_strings
,即使仅与密码库一起使用时也很有用。
libcrypto是加密库。它具有加密算法,密钥和证书生成和验证功能,消息身份验证算法等。
,您可以怀疑库未正确链接。有两种可能性:
该库根本没有链接
所链接的库不包含该符号,表明版本不匹配。
第二个似乎更可能,但第一个更容易检查。 ѭ6会指出库的手册页。
,在您的情况下,很有可能\“ Undefined Symbols \”表示您没有链接正确的库。