Установка RPATH для внешних проектов?

Я пытаюсь настроить проект, в котором мой репозиторий импортирует все зависимости в виде подмодулей git для упрощения разработки. Мои коллеги могут просто клонировать репо, git submodule update --init --recursive, cmake . а также make и иметь полностью рабочую среду разработки на месте. Структура каталогов настроена как суперстройка с CMakeLists.txt на верхнем уровне, который строит все подмодули, используя ExternalProject_Add, в результате чего получается следующая структура:

root
- CMakeLists.txt (superbuild)
- git_submodule_1
- git_submodule_2
- usr
- lib
- include
- my_project
- CMakeLists.txt (project)

CMakeLists.txt выглядит примерно так:

SET (INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/usr)

# Install git_submodule_1 with ${INSTALL_PREFIX} as a prefix
ExternalProject_Add( ... )

# Install git_submodule_2 with ${INSTALL_PREFIX} as a prefix
ExternalProject_Add( ... )

ExternalProject_Add(
MyProject
PREFIX ${CMAKE_SOURCE_DIR}/my_project
DEPENDS ExternalProject_git_submodule_1 ExternalProject_git_submodule_2

SOURCE_DIR ${CMAKE_SOURCE_DIR}/my_project
CMAKE_ARGS
-DCMAKE_LIBRARY_PATH:string=${INSTALL_PREFIX}/lib
-DCMAKE_PROGRAM_PATH:string=${INSTALL_PREFIX}/bin
-DCMAKE_INCLUDE_PATH:string=${INSTALL_PREFIX}/include

# etc, nothing nonstandard here
)

Процесс сборки работает отлично. я make на верхнем уровне зависимости устанавливаются в usrЯ cd в my_projectЯ делаю свою работу, все встроенные общие библиотеки найдены и связаны, я счастлив.

Тем не менее, когда я иду, чтобы запустить исполняемый файл на OS X, встроенный в my_projectЯ считаю, что динамические библиотеки помещаются в usr/lib каталог не может быть найден. Похоже, что CMake только устанавливает RPATH для библиотек встроенный в каталог проекта, который в этом случае просто my_project,

Можно ли как-нибудь добавить пользовательскую папку для установки в RPATH для библиотек времени исполнения и исполняемых файлов?

Несколько заметок:

  • Эта проблема, похоже, влияет только на OS X. В Linux таких проблем нет вообще.
  • Настройка DYLD_LIBRARY_PATH включить пользовательские места установки работ. Однако это добавляет дополнительный шаг к установке, и это раздражает, когда я пытаюсь отладить проблемы установки.
  • Настройка DYLD_FALLBACK_LIBRARY_PATH также работает, хотя это также не очень хороший вариант, поскольку он также добавляет дополнительный набор, и пользователям, использующим домашнее пиво, этот вариант не понравится

0

Решение

Для исполняемых файлов и общих библиотек, созданных с my_project/CMakeLists.txt добавлять ${INSTALL_PREFIX}/lib установить rpath, а также заставить CMake связать цели в дереве сборки с этим установочным rpath следующим образом:

set_target_properties(my_exe PROPERTIES INSTALL_RPATH "${INSTALL_PREFIX}/lib")
set_target_properties(my_exe PROPERTIES BUILD_WITH_INSTALL_RPATH ON)

Таким образом, загрузчик должен найти внешние библиотеки, установленные на ${CMAKE_SOURCE_DIR}/usr/lib каталог при запуске исполняемого файла из дерева сборки.

1

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

Других решений пока нет …

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