Я создал динамическую библиотеку 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 и как, с какой опцией?
РЕДАКТИРОВАТЬ: правильный способ сделать, как сказал Сергей 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.
Для этого и используется $ ORIGIN. Чтобы использовать его, вам потребуется следующий флаг для компоновщика при компоновке libB.so: ,-rpath,'$ORIGIN'
Это гарантирует, что libB.so всегда будет пытаться найти libA на своей стороне.
Однако обратите внимание, что ldd по-прежнему будет отображать полный путь к libA.