我试图设置一个项目,我的存储库将所有依赖项作为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
,我cd
到my_project
,我做了我的工作,所有建好的共享库都找到并链接了,我很高兴。
但是,当我在my_project
内部构建的OS X上运行可执行文件时,我发现无法找到放置在usr/lib
目录中的动态库。看起来CMake只设置了在项目目录内建立的库的RPATH
,其在这种情况下仅仅是my_project
。
有没有什么办法可以将定制安装位置添加到RPATH
的构建时库和可执行文件?
的几个注意事项:
- 这个问题似乎只影响OS X.的Linux根本不会出现这些问题。
- 设置
DYLD_LIBRARY_PATH
以包含自定义安装位置。但是,这增加了设置的额外步骤,并且在尝试调试安装问题时会变得烦人。 - 设置
DYLD_FALLBACK_LIBRARY_PATH
也可以,虽然这也不是一个好的选择,因为它也增加了一个额外的设置,并且自制软件用户不会喜欢这个选项。
这不会有这样的缺点,宁愿自定义库超过系统的?我试图设计这个项目来为开发提供所需的库,然后在安装完成后完全依赖于它们。 – Alex