将rpath项添加到构建树生成的可执行文件

时间:2016-12-12 21:56:15

标签: macos cmake rpath

我总是在构建树中运行我的可执行文件(我不是从cmake“install”运行它)。我们称之为fruit的库是一个框架:

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"   )

现在我想用cmake为主应用程序设置一个自定义rpath(名为executable)。我以为我可以使用INSTALL_RPATH的{​​{1}}目标属性来定义生成程序的rpath,但这似乎只适用于已安装的可执行文件(记住我总是在cmake构建文件夹中运行我的应用程序) ):

executable

如何将rpath项定义/添加到构建树中生成的程序?

PS。这个库# this rpath is not shown in the generated executable (otool -l -v executable): set_target_properties( executable PROPERTIES INSTALL_RPATH "@executable_path/lib/" ) 只是我实际问题的一个例子。该库是在子cmake项目(git子模块)中创建的,该项目将fruit属性添加到库中。但我有可能更改此项目的代码。有没有更好的方法让我的可执行文件在构建树中工作?

1 个答案:

答案 0 :(得分:0)

这不是主要问题的答案,但我找到了后期脚本的答案。这是一个比主要问题中的解决方案更好的解决方案,但我仍然坚持这个问题。

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