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

Macos 将rpath项添加到生成树生成的可执行文件,macos,cmake,rpath,Macos,Cmake,Rpath,我总是在构建树中运行我的可执行文件(我不会从cmake“安装”中运行它)。一个库,我们称之为fruit,是作为一个框架构建的: add_library( fruit SHARED ${FRUIT_SOURCES} ) set_target_properties( fruit PROPERTIES FRAMEWORK TRUE) set_target_properties( fruit PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE

我总是在构建树中运行我的可执行文件(我不会从cmake“安装”中运行它)。一个库,我们称之为
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\u RPATH
target属性为生成的程序定义我的RPATH,但这似乎只适用于已安装的可执行文件(请记住,我总是在cmake build文件夹中运行我的应用程序):

如何在生成树中生成的程序中定义/添加rpath项


PS.这个库
水果
只是我实际问题的一个例子。该库是在子cmake项目(git子模块)中创建的,该项目将
BUILD\u WITH\u INSTALL\u RPATH
属性添加到库中。但我有可能改变这个项目的代码。有没有更好的方法让我的可执行文件在构建树中工作?

这不是主要问题的答案,但我找到了后脚本的答案。这是一个比主要问题中讨论的更好的解决方案,但我让这个问题继续下去

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

代码取自。也请看这个。

这不是对主要问题的回答,但我找到了对后脚本的答案。这是一个比主要问题中讨论的更好的解决方案,但我让这个问题继续下去

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"   )
代码取自。也看到这个