Укажите зависимость времени выполнения и времени сборки в CMAKE - PullRequest
0 голосов
/ 04 июля 2018

Я использую CMAKE для создания общей библиотеки camera, которая зависит от api.so, которая также является общей библиотекой. Библиотека camera.so используется server исполняемым файлом, я нахожусь на Linux.

У меня есть каталог сборки CMAKE в ~/projects/server/camera/build.

Сервер в производственной среде имеет следующую структуру:

  • /opt/server
    • server
    • api.so
    • /lib/
      • camera.so

У меня есть следующий скрипт 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 следует использовать для решения этой проблемы? Я что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я должен был найти какое-то решение самостоятельно, потому что прошло довольно много времени с тех пор, как я отправил вопрос. Может быть, это обходной путь, я не знаю, я не нашел лучшего решения, он работает.

Решение, предложенное Цываревым, работает для библиотек, созданных в рамках того же проекта Cmake , но не работает для библиотек, созданных кем-то другим, что является моим случаем.

Я решил создать символическую ссылку в / usr / lib на каталог с общими библиотеками, который мне нужно связать с моей библиотекой. Таким образом, на сервере и на моей сборочной машине есть одна и та же символическая ссылка, но она указывает на другое место с библиотеками.

0 голосов
/ 04 июля 2018

Переменная CMAKE_INSTALL_RPATH влияет на RPATH для установленных библиотек (с командой install()).

Для распространения этих настроек для встроенных библиотек, установите CMAKE_BUILD_WITH_INSTALL_RPATH переменная:

set(CMAKE_INSTALL_RPATH "$ORIGIN/../")
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)

add_library(...)
...