Подключение библиотек so из папки с программой

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
ya_vanka
новенький
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Подключение библиотек so из папки с программой

Сообщение ya_vanka »

Добрый день.
Подскажите как настроить проект так, чтобы библиотеки под Linux брались из папки с программой, а не только из usr/lib?
Аватара пользователя
Xenar
постоялец
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

Сообщение Xenar »

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/Папка с библиотеками"
по другому вроде бы никак
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

ya_vanka писал(а):Добрый день.
Подскажите как настроить проект так, чтобы библиотеки под Linux брались из папки с программой, а не только из usr/lib?

А что мешает вычислить путь где находится приложение и на основе этого пути указать полный путь к библиотеке?

Код: Выделить всё

libname := ExtractFilePath(Application.ExeName) + DirectorySeparator + 'milib.so';
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Не помню: когда появилось такое явление. Но : DynLibs.LoadLibrary('путь/*.so'); вроде нормально подгружает библиотеки.
ya_vanka
новенький
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Сообщение ya_vanka »

Xenar
А "/Папка с библиотеками" - это абсолютный или относительный путь?

И получается мне нужно перед запуском программы всегда выполнять эту команду?
Или можно как-то компилятору/сборщику это передать чтобы он сам это делал?
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

если функции с модификатором external то надо путь туда пихать (да и то не факт что прокатит); пробовать и до запуска и после запуска - как получится; зависит от того как FPC загружает external-фции и от того как это делает система; скорее всего жизнеспособный вариант - только _до_ запуска
если функции загружаются f := GetProcAddress, то надо в LoadLibrary('...') поменять путь (тоже не факт что прокатит)
не прокатить может из-за каких-нибудь настроек безопасности, я слышал что линукс может не давать загружать .so бибилотеки из нестандартных мест
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

pupsik писал(а):Не помню: когда появилось такое явление. Но : DynLibs.LoadLibrary('путь/*.so'); вроде нормально подгружает библиотеки.

Разве есть другой путь для динамической загрузки библиотек?

Код: Выделить всё

uses
  DynLibs, FileUtil;

function LoadMyLib(const LibName: string): TLibHandle;
var
  FullLibName: string;
begin
  //Библиотека должна лежать рядом с выполняемым файлом
  //Здесь вычисляется полный путь к ней, LibName имя библиотеки.
  FullLibName := ExtractFilePath(Application.ExeName) + DirectorySeparator + LibName;
  if FileExistsUTF8(FullLibName) then
    Result := LoadLibrary(FullLibName) //Ищем либу в папке с программой
  else //Если либы в папке с программой нет, то
   Result := LoadLibrary(LibName);  //Пытаемся загрузить из системного каталога
end;
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

есть динамические библиотеки
которые в свою очередь могут загружаться "динамически": LoadLibrary или "статически": external
надо определиться у нас динамическая загрузка динамических библиотек или статическая загрузка динамических библиотек
Если термин "динамические библиотеки" общепринят болеменее, то с динамической и статической загрузкой всё не так очевидно
Давайте определимся уже
ya_vanka
новенький
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Сообщение ya_vanka »

Да, меня интересует статическая загрузка библиотек.
daesher
постоялец
Сообщения: 221
Зарегистрирован: 09.03.2010 21:17:14

Сообщение daesher »

ya_vanka писал(а):Да, меня интересует статическая загрузка библиотек.

Тогда решение - LD_LIBRARY_PATH. На крайний случай - LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ./<имя приложения>
Хотя, пожалуй, вернее будет LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd` ./<имя приложения>
Всё это можно оформить в виде скрипта, запускающего приложение.
ya_vanka
новенький
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Сообщение ya_vanka »

Спасибо за ответы!
Ответить