Динамическое подключение библиотеки C++ Linux/Unix

Подскажите пожалуйста не могу подключить библиотеку libcurl на linux, при подключении библиотеки требует библиотеку libssh, она находится в той-же папке, но программа ее не находит...

libssh2.so.1: cannot open shared object file: No such file or directory

curl = dlopen("./libcurl.so", RTLD_LAZY);

введите сюда описание изображения


Ответы (1 шт):

Автор решения: aleksandr barakin

проговорю проблему более формально: вам надо загрузить свою библиотеку (1), которой для работы требуется другая библиотека (2), не установленная в системе, но подложенная вами в тот же каталог, что и первая (библиотека).

вообще правильный путь заключается в пересборке библиотеки (1) с указанем в rpath специального пути $ORIGIN. цитата из man-страницы динамического загрузчика ld.so ($ man 8 ld.so):

$ORIGIN (or equivalently ${ORIGIN})
      This expands to the directory containing the program  or  shared
      object.   Thus,  an  application located in somedir/app could be
      compiled with

          gcc -Wl,-rpath,'$ORIGIN/../lib'

      so that it finds an associated shared object in  somedir/lib  no
      matter  where  somedir  is  located  in the directory hierarchy.
      This facilitates the creation of "turn-key" applications that do
      not  need  to be installed into special directories, but can in‐
      stead be unpacked into any directory and still  find  their  own
      shared objects.

но при острой необходимости можно воспользоваться и переменной окружения LD_LIBRARY_PATH, передав в ней путь, где находятся обе библиотеки.

наглядная демонстрация работоспособности:

$ ldd $(which curl) | grep libcurl
  libcurl.so.4 => /lib/x86_64-linux-gnu/libcurl.so.4 (0x00007f2a29a2c000)
$ readlink -f /lib/x86_64-linux-gnu/libcurl.so.4
/usr/lib/x86_64-linux-gnu/libcurl.so.4.4.0
$ ldd /usr/lib/x86_64-linux-gnu/libcurl.so.4.4.0 | grep libssh
  libssh2.so.1 => /lib/x86_64-linux-gnu/libssh2.so.1 (0x00007f5a31ffd000)
$ readlink -f /lib/x86_64-linux-gnu/libssh2.so.1
/usr/lib/x86_64-linux-gnu/libssh2.so.1.0.1

складываем обе библиотеки в какой-нибудь каталог:

$ mv /usr/lib/x86_64-linux-gnu/libcurl.so.4.4.0 /tmp/libcurl.so.4
$ mv /usr/lib/x86_64-linux-gnu/libssh2.so.1.0.1 /tmp/libssh2.so.1

пробуем воспользоваться библиотеками. естественно, неудачно:

$ curl --version
curl: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory

а теперь попробуем с LD_LIBRARY_PATH. работает:

$ LD_LIBRARY_PATH=/tmp curl --version
curl 7.52.1 (x86_64-pc-linux-gnu) libcurl/7.52.1 OpenSSL/1.0.2l zlib/1.2.8 libidn2/0.16 libpsl/0.17.0 (+libidn2/0.16) libssh2/1.7.0 nghttp2/1.18.1 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL
→ Ссылка