Путь общих библиотек как исполняемый каталог
У меня есть приложение, которое разбивается на несколько библиотек для повторного использования кода. В 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 (вместо исполняемого файла), ваша программа будет очень хорошо связываться.