【问题标题】:Specify RPATH for externally built CMAKE project为外部构建的 CMAKE 项目指定 RPATH
【发布时间】:2023-03-28 18:38:01
【问题描述】:

如何通过ExternalProject_Add() 宏为在 CMake(使用 3.0.0)外部构建的项目指定 RPATH?

作为参考,假设我的 ExternalProject 是 SFML。我的外部项目调用如下所示:

  set(SFML_INSTALL_PATH "${CMAKE_CURRENT_BINARY_DIR}/ext-deps/ext-sfml-build")
  set(SFML_RPATH "${SFML_INSTALL_PATH}/src/lib")
  set(SFML_CMAKE_ARGS -DCMAKE_BUILD_TYPE:STRING=Release -DUSE_STATIC_LIBS:BOOL=true
    -DCMAKE_INSTALL_PREFIX:PATH=${SFML_INSTALL_PATH}
    -DCMAKE_INSTALL_RPATH:PATH=${SFML_RPATH})

  ExternalProject_Add(ext-sfml
    GIT_REPOSITORY "${SFML_REPO}"
    GIT_TAG        "${SFML_TAG}"
    URL             SFML_URL
    URL_HASH        256=${SFML_SHA256}
    CMAKE_ARGS     "${SFML_CMAKE_ARGS}"
    TMP_DIR        "${CMAKE_CURRENT_BINARY_DIR}/${EXT_DEPS_PREFIX}/ext-sfml-tmp"
    STAMP_DIR      "${CMAKE_CURRENT_BINARY_DIR}/${EXT_DEPS_PREFIX}/ext-sfml-stamp"
    INSTALL_DIR    "${CMAKE_CURRENT_BINARY_DIR}/${EXT_DEPS_PREFIX}/ext-sfml-build"
    SOURCE_DIR     "${CMAKE_CURRENT_BINARY_DIR}/${EXT_DEPS_PREFIX}/ext-sfml"
    BINARY_DIR     "${CMAKE_CURRENT_BINARY_DIR}/${EXT_DEPS_PREFIX}/ext-sfml-build"
    TEST_COMMAND "")

我在运行构建步骤时得到的错误命令(配置没问题)是

Make Error at src/cmake_install.cmake:45 (file):
  file RPATH_CHANGE could not write new RPATH:

    /home/hendrix/repo/project/build/ext_deps/ext_sfml-build/lib

  to the file:

    /home/hendrix/repo/project/build/ext_deps/ext_sfml-build/bin/exe

最后,这个“/home/hendrix/repo/project/build/ext_deps/ext_sfml-build/lib”是我要修改的行。它似乎是我的 ${CMAKE_INSTALL_RPATH} 变量的值,但包含我的 ext-dep 项目的安装前缀,而不是顶级主项目。

【问题讨论】:

  • 我刚刚注意到我的${CMAKE_INSTALL_PREFIX} 可能有问题,因为它指向我的顶级 CMake 项目的目录。如何将其指向 ExternalProject 安装目录?
  • 您将变量SFML_CMALE_ARGS 声明为包含多个元素的列表。但是当取消引用这个变量时,你将它括在双引号中,所以它被视为单值变量。去掉双引号,参数会正确传递。
  • @Tsyvarev 尝试删除引号,但我收到了相同的错误消息。 RPATH 似乎与 ${SFML_CMAKE_ARGS} 中的不同
  • 可能是SFML项目自己设置了RPATH,或者调整了其他一些影响RPATH处理的变量。为了测试,您可以使用自己的项目创建 git repo。在该项目中,您可以添加对变量的message() 调用,这些调用通过ExternalProject_AddCMAKE_ARGS 选项传递给它。

标签: c++ cmake sfml


【解决方案1】:

我想通了(感谢 Tsyvarev 的 cmets)。我使用的外部构建项目设置了它自己的 RPATH。所以我在错误消息中找到的字符串是 RPATH,而不是我在“顶级”项目中设置的任何 RPATH。

似乎设置外部项目的 RPATH 不能覆盖该外部项目的内部设置 RPATH(如果它使用 CMAKE)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2013-02-16
    • 2021-04-17
    • 1970-01-01
    • 2017-04-29
    相关资源
    最近更新 更多