2016-12-12 7 views
0

Я всегда запускаю свой исполняемый файл в дереве сборки (я не запускаю его из cmake «install»). Библиотека, давайте назовем его fruit, построен в качестве основы:Добавление элемента rpath в созданный файл сгенерированного исполняемого файла

add_library(fruit SHARED ${FRUIT_SOURCES}) 
set_target_properties(fruit PROPERTIES FRAMEWORK TRUE) 
set_target_properties(fruit PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE 
          INSTALL_NAME_DIR "@rpath/Frameworks" ) 

Теперь я хочу, чтобы установить пользовательскую RPATH для основного приложения (называемого executable) с CMake. Я думал, что я мог бы использовать INSTALL_RPATH целевого свойство executable определить мои rpaths для сгенерированной программы, но это, кажется, работает только для установленного исполняемого (помните, я всегда бег моего приложения в папке CMake сборки):

# this rpath is not shown in the generated executable (otool -l -v executable): 
set_target_properties(executable PROPERTIES INSTALL_RPATH "@executable_path/lib/") 

Как определить/добавить элемент rpath в программу, сгенерированную в дереве сборки?

PS. Эта библиотека fruit является всего лишь примером моей реальной проблемы. Библиотека создается в проекте sub cmake (подмодуль git), который добавляет свойство BUILD_WITH_INSTALL_RPATH в библиотеку. Но у меня есть возможность изменить код для этого проекта. Есть ли лучший способ позволить моей исполняемой работе в дереве сборки?

ответ

0

Это не ответ на главный вопрос, но я понял ответ на сообщение scriptum. Это лучшее решение, чем тот, который рассматривается в главном вопросе, но я допускаю, чтобы этот вопрос сохранялся.

set(CMAKE_MACOSX_RPATH TRUE) 
set(CMAKE_SKIP_BUILD_RPATH FALSE) 
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 

################################################################################ 
# this is more interesting later when we implement install (i.e. creating a 
# bundle on macOS)in this CMakeLists! 
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") 
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 
# the RPATH to be used when installing, but only if it's not a system directory 
list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) 
if("${isSystemDir}" STREQUAL "-1") 
    set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") 
endif("${isSystemDir}" STREQUAL "-1") 
################################################################################ 

# add the dynamic library 
add_library(fruit SHARED ${FRUIT_SOURCES}) 
set_target_properties(fruit PROPERTIES FRAMEWORK TRUE) 
# remove the properties INSTALL_NAME_DIR and BUILD_WITH_INSTALL_RPATH: 
#set_target_properties(fruit PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE 
#        INSTALL_NAME_DIR "@rpath/Frameworks" ) 

Код взято из here. Также см. Это blog post.