Разделяемые библиотеки (lib.so)
Имеется скомпиленная либа (libnetclient.so), и имеется программа, линкующаяся с этой либой. Иерархия файлов:
./
src1.cpp src2.cpp libnetclient.so
./Release/
Application
Application - это сама скомпиленная программа.
Так вот, получается, что при линковке(с предварительным указанием линковщику) берется libnetclient.so из директории с исходниками. А при запуске скомпиленного приложения - либа ищется в директориях ld.so.conf, т.е. например в /usr/lib/, /usr/local/lib.
Вопрос - как мне сделать так, чтобы при запуске программа искала библиотеку в директории, где находится сама программа? То есть, мне нужно, чтобы когда находились в одной директории libnetclient.so и Application, то Application загружала именно эту библиотеку.
Вот текст ошибки при запсуке приложения:
error while loading shared libraries: libnetclient.so: cannot open shared object file: No such file or directory
P.S. Это относится и к программированию dll, поэтому, не отнес эту тему в раздел Linux/Unix.
В опциях линковщика(в моем случае не в makefile), а в среде eclipse(опять же, в моем примере - g++ linker) в miscellaneous добавить опцию -Xlinker с текстом:
-rpath=./
Т.е:
g++ (параметры) -Xlinker -rpath=./
Всем спасибо.
Допустим, я хочу это приложение переносить куда-нибудь, скажем, на другой компьютер. Мне там тоже прописывать пути? Это не айс :)
Есть вариант более, так сказать, портативный?
Допустим, я хочу это приложение переносить куда-нибудь, скажем, на другой компьютер. Мне там тоже прописывать пути? Это не айс :)
Есть вариант более, так сказать, портативный?
Хотя проблема, как говорится, решена, именно использование LD_LIBRARY_PATH является каноническим способом при неявной загрузке ДЛЛ (пользуясь терминологией Виндовс). Только нужно не так как предложено, а в переменных окружения делать LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/so Application
либо нужно с лдконфиг связываться. В общем-то это два документированных способа. Как вариант первого способа можно приложение запускать из скрипта, где прописано до запуска export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/so Application
Например, в gnuCC катит такой способ при связывании
gnuCC (всякое разное) /ПОЛНЫЙ_ПУТЬ/libnetclient.so
В этом случае возьмется имянно эта либа имянно оттуда, где она лежит. Но это некошерный способ.
Ну а то что в виндовсе есть переменная PATH окружения, которая должна быть "подправлена" при использовании ДЛЛ из нестандартных мест Вас не смущает? "Развертываете" приложение, сделайте соответствующие настройки, что за проблема?
Если Вам такое не нравится, попробуйте явную загрузку.