Загружать разделяемые библиотеки из каталога lib в CMake? - PullRequest
1 голос
/ 17 января 2020

Я скачал демонстрацию ROS2 из репозитория examples .

В частности, я использовал minimal_subscriber и minimal_publisher .

У меня установлен ROS2 в /opt/ros2, и когда я строю эти два примера с colcon build, он генерирует каталог install/ с lib/, shared/ и другую обычную структуру каталогов.

Я могу прекрасно выполнить и запустить эти демонстрационные примеры с моими текущими настройками на моем компьютере, но эти исполняемые файлы ссылаются на библиотеки, присутствующие в /opt/ros2, поэтому, когда я хочу выполнить их на другом компьютере без установленной ROS2, или я перенесу установку ROS2 в моя машина, исполняемые файлы не могут найти общие объекты.

Я добавил действительно простой скрипт, который добавляет все зависимости к install/lib при сборке, но исполняемые файлы, кажется, не заботятся, они не ищут для общих библиотек в сгенерированном каталоге lib они продолжают искать в /opt/ros2.

Я считаю, что это то, что я должен решить, я n CMake, и это не спецификация ROS2 c, так есть ли способ, с помощью которого я могу сказать моим сгенерированным исполняемым файлам искать в другом каталоге? (../lib или ./lib в моем случае)

1 Ответ

2 голосов
/ 17 января 2020

Если вы создаете их самостоятельно (предполагается, что вы упомянули CMake), вы можете установить RPATH в CMake ( документы здесь ). Определенно установите CMAKE_INSTALL_RPATH что-то вроде:

set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

Если вы не можете перестроить их, вы можете установить LD_LIBRARY_PATH в вашей среде, где расположены библиотеки, или вы можете исправить сами исполняемые файлы с помощью обновленный RPATH с использованием patchelf .

Чтобы получить относительный RPATH, а не абсолютный RPATH, используйте переменную $ORIGIN в rpath spe c. См. " Рекомендации " по ссылке выше для получения более подробной информации.

...