Связь во время выполнения с динамическими библиотеками, отсутствующими в LD_LIBRARY_PATH - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь связать мой проект с определенным набором скомпилированных пользовательских библиотек, размещенных в базовом каталоге проекта [proj_dir] / lib - ни в одной из системных / lib, / usr / lib или / usr/ local / lib - чтобы избежать конфликтов с установленными стоковыми версиями тех же библиотек.

Я могу скомпилировать проект, передав путь к библиотеке с флагом -L, но я получаю error while loading shared libraries libXXX.so: cannot open shared object file: No such file or directory, когда запускаю скомпилированный бинарный файл, и ldd говорит мне, что он не может найтиэти конкретные библиотеки.

С другой стороны, я могу запустить его без проблем, если передам LD_LIBRARY_PATH=[proj_dir]/lib исполняемому файлу.Тем не менее, есть ли способ неявного связывания этих библиотек без необходимости вручную устанавливать LD_LIBRARY_PATH во время выполнения?

1 Ответ

0 голосов
/ 08 июня 2018

Вы можете либо

  1. Написать скрипт-обертку, чтобы всегда включать LD_LIBRARY_PATH перед вызовом реальной программы (более гибко).
  2. Добавить -Wl,-rpath=<directory> в параметры компоновщика длядобавить каталог в путь поиска библиотеки времени выполнения.Итак, если у вас есть libfoo.so, а ваша программа и DSO должны находиться в одном каталоге, ваша команда компиляции может выглядеть так: gcc -o myprogam main.c -L. -lfoo -Wl,-rpath='$ORIGIN'.

Обновление: КакМаксим правильно отметил, что настройка -rpath=. опасна и ее следует избегать .

Для -Wl, см. справочную страницу gcc , а для -rpath см. ld manpage .

...