gpt4 book ai didi

linux - 为什么 openssl/md5.h 链接到 "crypto"而不是 "ssl"

转载 作者:太空宇宙 更新时间:2023-11-04 05:21:16 27 4
gpt4 key购买 nike

我正在尝试了解链接错误的原因。这个例子很具体,但原因可能是我不明白的一般原理。

我想从 this post 构建最小的示例。 Ubuntu 14.05.5。我做了:

$ apt-get install libssl-dev
$ opensll version
OpenSSL 1.0.1f 6 Jan 2014
$ echo $LD_LIBRARY_PATH
/usr/local:
$ gcc -I/usr/include/openssl -o test md5.c -L/usr/lib/x86_64-linux-gnu -lssl
/tmp/ccUSgfgs.o: In function `main':
md5.c:(.text+0x26): undefined reference to `MD5_Init'
md5.c:(.text+0x68): undefined reference to `MD5_Update'
md5.c:(.text+0xab): undefined reference to `MD5_Final'
collect2: error: ld returned 1 exit status

这会引发常见的链接错误。它找不到这些符号的定义。通过随机尝试,我发现这个版本:

$ gcc  -I/usr/include/openssl -o test md5.c  -L/usr/lib/x86_64-linux-gnu -lcrypto    

唯一的区别是“-l crypto”而不是“-l ssl”

为什么一个构建而另一个不构建?

最佳答案

因为 libcrypto.a 包含定义,而不是 libssl.a。证明是:

$ nm /usr/lib/x86_64-linux-gnu/libssl.a | grep MD5
U MD5_Init
U MD5_Transform

嗯,其中一个符号是存在的,但 U 表示未定义。相反:

$ nm /usr/lib/x86_64-linux-gnu/libcrypto.a | grep MD5
nm: ebcdic.o: no symbols
00000000000001f0 T MD5_Final
0000000000000340 T MD5_Init
00000000000001e0 T MD5_Transform
0000000000000000 T MD5_Update

符号带有定义。案子解决了。通过阅读文档也许可以节省自己一些时间。

关于linux - 为什么 openssl/md5.h 链接到 "crypto"而不是 "ssl",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41697016/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com