在CMake中,您可以使用
将相对路径转换为绝对路径get_filename_component(ABSOLUTE_PATH ${RELATIVE_PATH} ABSOLUTE)
但是,../../other_program/
等路径基于源目录(即CMakeLists.txt
文件所在的目录),而不是构建目录(即调用cmake
的目录)。如果将相对路径作为命令行选项,这可能会导致一些混淆。
有没有办法告诉get_filename_component
它应该基于当前二进制目录而不是当前源目录的相对路径?
答案 0 :(得分:18)
来自get_filename_component
的文档(突出显示为我)
:
get_filename_component(<VAR> <FileName> <COMP> [BASE_DIR <BASE_DIR>] [CACHE])
将
<VAR>
设置为<FileName>
的绝对路径,其中<COMP>
是其中之一:
ABSOLUTE
=文件的完整路径REALPATH
=解决了符号链接的现有文件的完整路径如果提供的
<FileName>
是相对路径,则相对于给定的基目录<BASE_DIR>
进行评估。如果没有提供基目录,则默认基目录将是CMAKE_CURRENT_SOURCE_DIR
。使用正斜杠返回路径,并且没有尾部斜杠。如果指定了可选的
CACHE
参数,则结果变量将添加到缓存中。
因此,您使用:
get_filename_component(buildDirRelFilePath "${myFile}"
REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")
要将文件的绝对路径转换为相对路径,可以使用file
command:
file(RELATIVE_PATH <variable> <directory> <file>)
计算从
<directory>
到<file>
的相对路径,并将其存储在<variable>
。
file(RELATIVE_PATH buildDirRelFilePath "${CMAKE_BINARY_DIR}" "${myFile}")
答案 1 :(得分:9)
get_filename_component(MY_RESULT_ABSOLUTE_PATH_VAR
"${CMAKE_CURRENT_LIST_DIR}/${MY_RELATIVE_PATH_VAR}"
ABSOLUTE)
答案 2 :(得分:3)
您可以检查路径是否是if(IS_ABSOLUTE path)
的绝对路径,以及它是否不包含您想要的基本目录。例如,
if(NOT IS_ABSOLUTE ${p})
set(p "${CMAKE_CURRENT_BINARY_DIR}/${p}")
endif()