为外部项目设置RPATH

Setting the RPATH for external projects?

本文关键字:RPATH 设置 项目 外部      更新时间:2023-10-16

我试图设置一个项目,我的存储库导入所有依赖关系作为git子模块,以便于开发。我的同事可以简单地克隆repo, git submodule update --init --recursive, cmake .make,并拥有一个完整的工作开发环境。目录结构设置为超级构建,在顶层使用ExternalProject_Add构建所有子模块的CMakeLists.txt,从而产生以下结构:

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
)

构建过程运行良好。如果make在顶层,依赖项被安装到usr中,如果cd被安装到my_project中,我做我的工作,所有构建的共享库都被找到并链接,我很高兴。

然而,当我在OS X上运行my_project内构建的可执行文件时,我发现无法找到放置在usr/lib目录中的动态库。看来,CMake只设置RPATH内构建的项目目录,在这种情况下,只是my_project

是否有任何方法可以将自定义安装位置添加到RPATH用于构建时库和可执行文件?

注意事项:

  • 这个问题只出现在OS x上,Linux没有出现这些问题。
  • 设置DYLD_LIBRARY_PATH以包含自定义安装位置有效。但是,这为设置增加了额外的步骤,并且当我尝试调试安装问题时,它变得很烦人。
  • 设置DYLD_FALLBACK_LIBRARY_PATH也可以,尽管这也不是一个好的选择,因为它还增加了一个额外的集合,自制用户不会喜欢这个选项。

对于使用my_project/CMakeLists.txt构建的可执行文件和共享库,将${INSTALL_PREFIX}/lib添加到install rpath中,并使CMake以以下方式将构建树中的目标与该install 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目录中的外部库。