1

我正在尝试设置一个项目,其中我的存储库将所有依赖项导入为 git 子模块以便于开发。我的同事可以简单地克隆存储库,git submodule update --init --recursivecmake .拥有make一个完全可用的开发环境。目录结构被设置为一个超级CMakeLists.txt构建,在顶层使用 构建所有子模块ExternalProject_Add,导致以下结构:

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也可以,尽管这也不是一个好的选择,因为它还添加了一个额外的设置,而且自制软件用户不会喜欢这个选项。
4

1 回答 1

1

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

于 2015-09-25T18:49:31.417 回答