Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Разделяемые библиотеки (lib.so)

9.1K
06 мая 2012 года
motorw
134 / / 15.12.2009
Всем привет! Опишу свою проблему:
Имеется скомпиленная либа (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.
9.1K
06 мая 2012 года
motorw
134 / / 15.12.2009
Ответ найден благодаря человеку с ником Ramon:

В опциях линковщика(в моем случае не в makefile), а в среде eclipse(опять же, в моем примере - g++ linker) в miscellaneous добавить опцию -Xlinker с текстом:
-rpath=./

Т.е:
g++ (параметры) -Xlinker -rpath=./

Всем спасибо.
285
06 мая 2012 года
Romik
479 / / 24.11.2002
Можно использовать LD_LIBRARY_PATH
 
Код:
LD_LIBRARY_PATH=/path/to/so Application
9.1K
06 мая 2012 года
motorw
134 / / 15.12.2009
Это я уже читал, однако, вопрос встречный:
Допустим, я хочу это приложение переносить куда-нибудь, скажем, на другой компьютер. Мне там тоже прописывать пути? Это не айс :)
Есть вариант более, так сказать, портативный?
260
06 мая 2012 года
Ramon
1.1K / / 16.08.2003
 
Код:
ld -rpath
82K
12 мая 2012 года
suroviy
3 / / 03.05.2012
Цитата: motorw
Это я уже читал, однако, вопрос встречный:
Допустим, я хочу это приложение переносить куда-нибудь, скажем, на другой компьютер. Мне там тоже прописывать пути? Это не айс :)
Есть вариант более, так сказать, портативный?



Хотя проблема, как говорится, решена, именно использование 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 окружения, которая должна быть "подправлена" при использовании ДЛЛ из нестандартных мест Вас не смущает? "Развертываете" приложение, сделайте соответствующие настройки, что за проблема?

Если Вам такое не нравится, попробуйте явную загрузку.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог