Macos 将rpath项添加到生成树生成的可执行文件
我总是在构建树中运行我的可执行文件(我不会从cmake“安装”中运行它)。一个库,我们称之为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
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" )
代码取自。也看到这个