2015-09-25 6 views
0

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

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 
) 

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

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

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

Несколько замечаний:

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

ответ

1

Для исполняемых файлов и разделяемых библиотек, построенных с 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, при запуске исполняемого файла из дерева сборки.

+0

Не было бы у этого недостатка предпочтительнее настраивать библиотеки по системным? Я пытаюсь спроектировать проект, чтобы предоставить необходимые библиотеки для разработки, а затем полностью освобожден от необходимости после его установки. – Alex

Смежные вопросы