【发布时间】: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_Add的CMAKE_ARGS选项传递给它。