Примечание: Полный рабочий пример теперь ниже. Исходный вопрос следует:
У меня проблемы с использованием параметра ld -rpath
с $ ORIGIN
.
Поскольку мне не удалось найти полный пример, я подумал, что попробую написать его сам, чтобы я и другие могли использовать его позже. Как только он заработает, я приберу его.
Я спрашивал об этом раньше , но я думаю, что мой пост был немного запутанным.
Пример проекта строит одну общую библиотеку и один исполняемый файл, которые связаны с указанной библиотекой.
Он очень маленький (3 файла, 22 строки, включая скрипт сборки).
Вы можете скачать проект с здесь
Файловая структура (перед сборкой):
project /
src /
foo.cpp
main.cpp
make.sh
] project / src / foo.cpp
int foo()
{ return 3; }
project / src / main.cpp
int foo();
#include
int main()
{
std::cout << foo() << std::endl;
return 0;
}
project / make.sh
# Make directories:
mkdir -p -v obj
mkdir -p -v lib
mkdir -p -v run
# Build the library:
g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/foo.sh obj/foo.o
# Build the executable:
g++ -c -o obj/main.o src/main.cpp
g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../../lib' -Llib -l:foo.sh
Из каталога project
запустите make.sh
(убедитесь, что он исполняемый).
Структура файла (после сборки):
project /
src /
foo.cpp
main.cpp
obj /
foo.o
main.o
lib /
foo.so
run /
main.run
make.sh
run / main.run
теперь должен загрузить ] lib / foo.sh
при выполнении из любого места.
В настоящее время это работает только частично.
Файлы компилируются и связываются нормально, но не удается установить ссылку при запуске из любого каталога, кроме project
(который является точкой упражнения).
Проверка main.run
с помощью readelf -d
показывает: 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [lib / foo.sh]
0x000000000000000f (RPATH) Путь к библиотеке: [$ ORIGIN /../../ lib]
Что выглядит очень близко (я бы предпочел [foo.sh]
, чем [lib / foo.sh]
, но я исправлю это позже).
КРАТКОЕ ОПИСАНИЕ ] $ ORIGIN
в -Wl, -rpath, '$ ORIGIN /../../ lib'
означает project / run / main.run
, поэтому этот rpath должен стать project / lib
.
Я пробовал $ ORIGIN / ..
, $ ORIGIN /../ lib
, $ ORIGIN / .. /..
, $ ORIGIN /../../ lib
безрезультатно.
Примечание: я использую -l:
, который требует полной библиотеки имя файла (среди прочего, проще написать сценарий с переменными, когда все функции имеют одинаковый формат имени).
Кто-нибудь знает, почему это не работает?
Или, наоборот, есть ли у кого-нибудь или знает полный рабочий пример?