Если это система Linux, то есть вероятность, что вы locate
поддерживаете регулярные выражения:
locate --regex 'A-B.*\.dir$'
Если нет,
locate 'A-B' | grep '\.dir$'
Главное правильно привязать регулярное выражение к концу строки с помощью $
.
Обратите внимание, что оба этих варианта также найдут, например,. /some/path/ABBA-Bootlegs/thing.dir
.
Is there an rpath for dynamic linked libraries?
Да, есть. Вы можете использовать -Wl,-rpath
с общими объектами ELF просто как с исполняемыми файлами ELF. Клонируйте небольшой пример, который я выложил здесь:
git clone https://gist.github.com/ardrabczyk/6aeb8545c9b754d6b15be390af4bdff0
Запустите make
для компиляции. Проверьте, какие библиотеки нужны для main
Исполняемый файл ELF:
$ readelf -d./main
Dynamic section at offset 0xe30 contains 22 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libtwo.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [.]
(...)
И проверьте, какие библиотеки нужны поlibtwo.so
:
$ readelf -d./libtwo.so
Dynamic section at offset 0xe38 contains 22 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libone.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [libs]
(...)
Как видите, и main
, и libtwo.so
нуждаются в некоторых общих объектах. и у обоих установлен rpath. Вам не нужно устанавливать LD _LIBRARY _PATH для запуска./основной:
$./main
I'm in bar()
main всегда будет искать свою зависимость libtwo.so в .
, которая является текущий каталог, а libtwo.so, в свою очередь, всегда будет искать его Зависимость libone.so в каталоге libs
. Если libs
отсутствует./main не заводится:
$ mv libs libs.bak
$./main
./main: error while loading shared libraries: libone.so: cannot open shared object file: No such file or directory
Восстановить:
$ mv libs.bak libs
$./main
I'm in bar()
Поскольку вы не хотите рассматривать его как часть системы, используйте его как есть; пользовательское приложение!
Если вы добавите ~/.local/lib/
к вашему LD_LIBRARY_PATH
, вы сможете поместить туда все. Просто создайте частичную структуру FHS под ~/.local/
, например bin , и т. д. , lib и share . Таким образом, вам не нужно вызывать программу с предшествующей переменной окружения. Всем другим системам просто нужно будет добавить этот каталог в свою переменную среды пути к библиотеке. Очень аккуратный и unixish.
Если вы отвергнете и это решение, останется только одна возможность. Либо вы используете фиксированный путь, который ожидается в каждой системе, либо переменную среды, которая содержит путь и также ожидается.