Подключение библиотек so из папки с программой
Модератор: Модераторы
Подключение библиотек so из папки с программой
Добрый день.
Подскажите как настроить проект так, чтобы библиотеки под Linux брались из папки с программой, а не только из usr/lib?
Подскажите как настроить проект так, чтобы библиотеки под Linux брались из папки с программой, а не только из usr/lib?
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/Папка с библиотеками"
по другому вроде бы никак
по другому вроде бы никак
- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
ya_vanka писал(а):Добрый день.
Подскажите как настроить проект так, чтобы библиотеки под Linux брались из папки с программой, а не только из usr/lib?
А что мешает вычислить путь где находится приложение и на основе этого пути указать полный путь к библиотеке?
Код: Выделить всё
libname := ExtractFilePath(Application.ExeName) + DirectorySeparator + 'milib.so';Не помню: когда появилось такое явление. Но : DynLibs.LoadLibrary('путь/*.so'); вроде нормально подгружает библиотеки.
Xenar
А "/Папка с библиотеками" - это абсолютный или относительный путь?
И получается мне нужно перед запуском программы всегда выполнять эту команду?
Или можно как-то компилятору/сборщику это передать чтобы он сам это делал?
А "/Папка с библиотеками" - это абсолютный или относительный путь?
И получается мне нужно перед запуском программы всегда выполнять эту команду?
Или можно как-то компилятору/сборщику это передать чтобы он сам это делал?
если функции с модификатором external то надо путь туда пихать (да и то не факт что прокатит); пробовать и до запуска и после запуска - как получится; зависит от того как FPC загружает external-фции и от того как это делает система; скорее всего жизнеспособный вариант - только _до_ запуска
если функции загружаются f := GetProcAddress, то надо в LoadLibrary('...') поменять путь (тоже не факт что прокатит)
не прокатить может из-за каких-нибудь настроек безопасности, я слышал что линукс может не давать загружать .so бибилотеки из нестандартных мест
если функции загружаются f := GetProcAddress, то надо в LoadLibrary('...') поменять путь (тоже не факт что прокатит)
не прокатить может из-за каких-нибудь настроек безопасности, я слышал что линукс может не давать загружать .so бибилотеки из нестандартных мест
- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
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;есть динамические библиотеки
которые в свою очередь могут загружаться "динамически": LoadLibrary или "статически": external
надо определиться у нас динамическая загрузка динамических библиотек или статическая загрузка динамических библиотек
Если термин "динамические библиотеки" общепринят болеменее, то с динамической и статической загрузкой всё не так очевидно
Давайте определимся уже
которые в свою очередь могут загружаться "динамически": LoadLibrary или "статически": external
надо определиться у нас динамическая загрузка динамических библиотек или статическая загрузка динамических библиотек
Если термин "динамические библиотеки" общепринят болеменее, то с динамической и статической загрузкой всё не так очевидно
Давайте определимся уже
Да, меня интересует статическая загрузка библиотек.
ya_vanka писал(а):Да, меня интересует статическая загрузка библиотек.
Тогда решение - LD_LIBRARY_PATH. На крайний случай - LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ./<имя приложения>
Хотя, пожалуй, вернее будет LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd` ./<имя приложения>
Всё это можно оформить в виде скрипта, запускающего приложение.
Спасибо за ответы!
