Я использую CMAKE для создания общей библиотеки camera
, которая зависит от api.so
, которая также является общей библиотекой. Библиотека camera.so
используется server
исполняемым файлом, я нахожусь на Linux.
У меня есть каталог сборки CMAKE в ~/projects/server/camera/build
.
Сервер в производственной среде имеет следующую структуру:
У меня есть следующий скрипт CMAKE:
SET(LIB_DIR ${PROJECT_SOURCE_DIR}/lib/Release)
ADD_LIBRARY(api SHARED IMPORTED)
SET_PROPERTY(TARGET api PROPERTY IMPORTED_LOCATION ${LIB_DIR}/api.so)
TARGET_LINK_LIBRARIES(camera
api
)
Переменная PROJECT_SOURCE_DIR
содержит ~/projects/server
.
Мне нужно использовать IMPORTED_LOCATION
, потому что api.so
имя библиотеки не начинается с lib
, я ничего не могу с этим поделать, он работает.
Я успешно собираю camera.so
, затем помещаю его на рабочий сервер в каталог /opt/server/lib
. Когда я запускаю ldd /opt/server/lib/camera.so
, я вижу, что libary ищет api.so
в каталоге, где он у меня находится на сборочной машине, но я хотел бы заставить библиотеку искать его во время выполнения на один уровень вверх, поэтому в ../api.so
.
Мне все равно, будет ли это использоваться относительным или абсолютным путем, но оно должно быть где-то еще, а не там, где я использую его для связи на моем компьютере . Я не хочу использовать LD_LIBRARY_PATH
, решение должно быть сделано в сценарии CMAKE.
Пока нашел и попробовал:
SET(CMAKE_INSTALL_RPATH "@executable_path/../")
SET(CMAKE_INSTALL_RPATH "$ORIGIN/../")
Но ldd
все еще продолжает говорить мне, что ищет мой каталог сборки, которого нет в производстве.
Подскажите, пожалуйста, какую команду CMAKE следует использовать для решения этой проблемы? Я что-то не так делаю?