Путь общих библиотек как исполняемый каталог

У меня есть приложение, которое разбивается на несколько библиотек для повторного использования кода. В Windows все, что мне нужно сделать, это поместить файлы .dll в тот же путь, что и исполняемый файл, и он автоматически находит их. В Linux (поскольку он жестко кодирует пути к вещам), я должен указать переменную окружения LD_LIBRARY_PATH или предварительно загрузить библиотеки перед исполняемым файлом.

Я видел некоторые вещи о встраивании пути с использованием опции компоновщика -Wl,-rpath=<PATH>, и я пробовал ее с помощью . в качестве пути. Но это выглядит только в текущем рабочем каталоге, а не в исполняемом каталоге.

Есть ли способ указать в компоновщике, чтобы по умолчанию искать в каталоге исполняемого файла для разделяемых библиотек (например, в Windows)?

Спасибо! Matt

Ответы

Ответ 1

Вам нужно $ORIGIN в RPATH, используя соответствующую опцию ld или другой инструмент Darwin. См. this и this.

Помните, что значение $должно действительно заканчиваться в пути, поэтому вам нужно указывать или удалять его в командной строке ссылки.

Обновление: Вы можете видеть, что компоновщик действительно помещает в ваш исполняемый файл с помощью

readelf -d /path/to/exe | grep RPATH

Вот как выглядит результат:

 0x0000000f (RPATH)              Library rpath: [$ORIGIN]

Ответ 2

Оберните свою программу в оболочку script:

#!/bin/sh

PROGRAM_DIRECTORY="`dirname "$0"`"
export LD_LIBRARY_PATH="$PROGRAM_DIRECTORY"

"$PROGRAM_DIRECTORY/program_executable" "[email protected]"

Если вы запустите этот script (вместо исполняемого файла), ваша программа будет очень хорошо связываться.