我正在尝试设置一个项目,其中我的存储库将所有依赖项导入为 git 子模块以便于开发。我的同事可以简单地克隆存储库,git submodule update --init --recursive
并cmake .
拥有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
也可以,尽管这也不是一个好的选择,因为它还添加了一个额外的设置,而且自制软件用户不会喜欢这个选项。