2017-01-17 20 views
-1

Я пытаюсь понять причину ошибки связывания. Этот пример специфичен, но причина, вероятно, является общим принципом, который я не понимаю.Почему ссылка openssl/md5.h против «crypto», но не «ssl»

Я хотел создать минимальный пример от 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 крипто» вместо «-l SSL»

Почему один билд, а другой нет?

+0

Также см. [Как создать хеш-строку md5 в C?] (Http://stackoverflow.com/q/7627723) – jww

ответ

0

Поскольку libcrypto.a содержит определения, а не libssl.a. Доказательство:

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

Ну, один из символов есть, но U означает undefined. Скорее:

$ 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 

Символы существуют с определениями. Дело решено. Вероятно, вы могли бы сэкономить некоторое время, прочитав документацию.

 Смежные вопросы

  • Нет связанных вопросов^_^