gpt4 book ai didi

c++ - 为外部项目设置 RPATH?

转载 作者:行者123 更新时间:2023-11-28 06:03:46 28 4
gpt4 key购买 nike

我正在尝试设置一个项目,我的存储库将所有依赖项作为 git 子模块导入,以便于开发。我的同事可以简单地克隆 repo、git submodule update --init --recursivecmake .make 并拥有一个完整的开发环境到位。目录结构被设置为 super 构建,在顶层有一个 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,我 cdmy_project,我做我的工作,找到并链接了所有构建的共享库,我很高兴。

但是,当我在 my_project 内构建的 OS X 上运行可执行文件时,我发现无法找到放置在 usr/lib 目录中的动态库。看起来 CMake 只为 在项目目录中构建的库 设置 RPATH,在本例中就是 my_project

有什么方法可以将自定义安装位置添加到构建时库和可执行文件的 RPATH 中?

一些注意事项:

  • 此问题似乎只影响 OS X。Linux 根本不会出现这些问题。
  • DYLD_LIBRARY_PATH 设置为包括自定义安装位置即可。但是,这会在设置中增加一个额外的步骤,并且当我尝试调试安装问题时它会变得很烦人。
  • 设置 DYLD_FALLBACK_LIBRARY_PATH 也可以,尽管这也不是一个好的选择,因为它还会添加一个额外的集合,而自制软件用户不会喜欢这个选项。

最佳答案

对于使用 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 目录的外部库。

关于c++ - 为外部项目设置 RPATH?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32786461/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com