Как избежать полного пути для динамического связывания?

Я создал динамическую библиотеку libA.so. Теперь я хочу создать другую динамическую библиотеку libB.so, связанную с libA.so.

С помощью команды ldd я вижу абсолютный путь к libA.so:

ldd full_path_to_libB/libB.so
libx.so => full_path_to_libx (0x....)
.
.
fullpath_to_libA/libA.so (0x....)

Но я бы хотел избежать полного пути к библиотеке libA.so, чтобы получить это с помощью ldd:

ldd full_path_to_libB/libB.so
libx.so => full_path_to_libx (0x....)
.
.
libA.so => full_path_to_libA/libA.so (addr)

Это предполагает, например, добавить full_path_to_libB в LD_LIBRARY_PATH.

Чтобы добавить дополнительный библиотечный репозиторий, я попытался добавить некоторые параметры в компоновщик, но ничего не получалось.

g++: error: libA.so not found

Можно ли избежать получения только полного пути libA.so и как, с какой опцией?

2

Решение

РЕДАКТИРОВАТЬ: правильный способ сделать, как сказал Сергей A:

g ++ -shared -fPIC -L. -lA libB.cpp -Wl, -rpath, ‘$ ORIGIN’ -o libB.so

Когда исполняемый файл, который вы соберете с вашими библиотеками, находится в том же пути, что и ваши библиотеки, вы можете сделать это:

g ++ -shared -fPIC -L. -lA libB.cpp -Wl, -rpath ,. -o libB.so

он должен ссылаться на локальный (-L. добавление в качестве пути для сборки и -rpath, для выполнения). Как отметил Сергей А. это $ PWD, а не $ ORIGIN.

2

Другие решения

Для этого и используется $ ORIGIN. Чтобы использовать его, вам потребуется следующий флаг для компоновщика при компоновке libB.so: ,-rpath,'$ORIGIN' Это гарантирует, что libB.so всегда будет пытаться найти libA на своей стороне.

Однако обратите внимание, что ldd по-прежнему будет отображать полный путь к libA.

1

По вопросам рекламы [email protected]