Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么openssl/md5.h链接到;“加密”;但不是",;ssl“;_Linux_Build_Openssl - Fatal编程技术网

Linux 为什么openssl/md5.h链接到;“加密”;但不是",;ssl“;

Linux 为什么openssl/md5.h链接到;“加密”;但不是",;ssl“;,linux,build,openssl,Linux,Build,Openssl,我正在试图了解链接错误的原因。这个例子很具体,但原因可能是我不理解的一般原则 我想从中构建一个最小的示例。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-linu

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

我想从中构建一个最小的示例。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
符号是有定义的。案件得到解决。阅读文档可能会为我节省一些时间。

另请参见