2015-09-25 33 views
0

我试图设置一个项目,我的存储库将所有依赖项作为git子模块导入,以便于开发。我的同事可以简单地克隆回购,git submodule update --init --recursive,cmake .make,并有一个完全有效的开发环境。目录结构设置为在顶层有CMakeLists.txt一个superbuild是建立使用ExternalProject_Add的所有子模块,导致结构如下:为外部项目设置RPATH?

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,我cdmy_project,我做了我的工作,所有建好的共享库都找到并链接了,我很高兴。

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

有没有什么办法可以将定制安装位置添加到RPATH的构建时库和可执行文件?

的几个注意事项:

  • 这个问题似乎只影响OS X.的Linux根本不会出现这些问题。
  • 设置DYLD_LIBRARY_PATH以包含自定义安装位置。但是,这增加了设置的额外步骤,并且在尝试调试安装问题时会变得烦人。
  • 设置DYLD_FALLBACK_LIBRARY_PATH也可以,虽然这也不是一个好的选择,因为它也增加了一个额外的设置,并且自制软件用户不会喜欢这个选项。

回答

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目录的外部库。

+0

这不会有这样的缺点,宁愿自定义库超过系统的?我试图设计这个项目来为开发提供所需的库,然后在安装完成后完全依赖于它们。 – Alex