Динамическое подключение библиотеки 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 шт):
проговорю проблему более формально: вам надо загрузить свою библиотеку (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
