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

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

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

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

Спасибо! Мэтт


person CuppM    schedule 23.11.2009    source источник


Ответы (2)


Вам нужно $ORIGIN в вашем RPATH через соответствующую опцию в ld или другом инструменте Darwin. См. это и это.

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

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

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

Вот как должен выглядеть вывод:

 0x0000000f (RPATH)              Library rpath: [$ORIGIN]
person bmargulies    schedule 23.11.2009
comment
При использовании $ORIGIN вам нужно убедиться, что $ правильно заключен в кавычки, чтобы компоновщик действительно его увидел. Из командной строки вы хотите -rpath \$ORIGIN и из Makefile вы хотите -rpath \$$ORIGIN - person R Samuel Klatchko; 23.11.2009
comment
Я использую Eclipse и CDT, и я добавляю этот параметр к другим флагам компоновщика. Я ставлю -Wl,-rpath=$$ORIGIN, и в окне вывода это отображается с одним $. Но вроде не работает. Я пробовал несколько вариантов, но ничего не происходит. Это похоже на то, что компоновщик просто игнорирует флаг. Я пробовал: -Wl,-rpath=$ORIGIN -Wl,--rpath=$ORIGIN -Wl,-rpath=/$ORIGIN -Wl,-rpath=$ORIGIN/ -Wl,-rpath=/$ORIGIN/ и Т. Д. - person CuppM; 24.11.2009
comment
Используйте elfdump или местный эквивалент, чтобы посмотреть, что там? Используйте ldd и посмотрите, что он говорит? - person bmargulies; 24.11.2009
comment
Как насчет -rpath \$$ORIGIN, как упоминалось выше? - person John Zwinck; 24.11.2009
comment
Это сделало это, я просто неправильно экранировал символы $. Возможность проверить это с помощью readelf помогла убедиться, что я правильно понял строку параметра. Строка флага, которая работала в Eclipse, — -Wl,-rpath=\$$ORIGIN. - person CuppM; 24.11.2009
comment
Таким образом, $ORIGIN на самом деле является путем к исполняемому файлу, независимо от того, куда вы поместите исполняемый файл. - person baye; 04.09.2012

Оберните вашу программу в сценарий оболочки:

#!/bin/sh

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

"$PROGRAM_DIRECTORY/program_executable" "$@"

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

person P Shved    schedule 23.11.2009
comment
Да, это то, что я делал, и это работает. У приложения есть параллельная версия, использующая OpenMPI, и у нее есть способ совместного использования LD_LIBRARY_PATH. Итак, в настоящее время мы используем этот обходной путь, но нам нужен более простой способ сделать что-то, потому что приложение (а также средство запуска MPI) принимает несколько флагов для того, что обрабатывать. - person CuppM; 24.11.2009
comment
Вы можете передать все аргументы из вашего скрипта в программу с помощью "$@". - person ; 24.11.2009