CMake:将相对路径转换为绝对路径,将build目录作为当前目录

Jul*_*ich 24 cmake

在CMake中,您可以使用相对路径转换为绝对路径

get_filename_component(ABSOLUTE_PATH ${RELATIVE_PATH} ABSOLUTE)
Run Code Online (Sandbox Code Playgroud)

但是,诸如../../other_program/基于源目录(即文件所在的CMakeLists.txt目录)的路径,而不是构建目录(即从中cmake调用的目录).如果将相对路径指定为命令行选项,则可能会导致一些混淆.

有没有办法告诉get_filename_component它应该基于当前二进制目录而不是当前源目录的相对路径?

Tor*_*örn 22

来自(突出显示为我)的文档 :get_filename_component

get_filename_component(<VAR> <FileName>
                       <COMP> [BASE_DIR <BASE_DIR>]
                       [CACHE])
Run Code Online (Sandbox Code Playgroud)

设置<VAR>为绝对路径<FileName>,其中<COMP>之一是:

ABSOLUTE=文件的 REALPATH完整路径=解决了符号链接的现有文件的完整路径

如果提供的<FileName>是相对路径,则相对于给定的基本目录评估它<BASE_DIR>.如果未提供基目录,则默认基目录为CMAKE_CURRENT_SOURCE_DIR.

路径以正斜杠返回,并且没有尾部斜杠.如果CACHE指定了可选参数,则将结果变量添加到缓存中.

因此,您使用:

get_filename_component(buildDirRelFilePath "${myFile}"
                       REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")
Run Code Online (Sandbox Code Playgroud)

要将文件的绝对路径转换为相对路径,可以使用以下file命令:

file(RELATIVE_PATH <variable> <directory> <file>)
Run Code Online (Sandbox Code Playgroud)

计算从a <directory>到a 的相对路径<file>并将其存储在<variable>.

file(RELATIVE_PATH buildDirRelFilePath "${CMAKE_BINARY_DIR}" "${myFile}")
Run Code Online (Sandbox Code Playgroud)

  • 请始终使用“CMAKE_CURRENT_[BINARY|SOURCE]_DIR”,而不仅仅是“CMAKE_[BINARY|SOURCE]_DIR”变量。对于试图在更大的项目中使用您的库的人来说,后者会搞乱很多事情。 (2认同)

tvo*_*rez 12

get_filename_component(MY_RESULT_ABSOLUTE_PATH_VAR
                       "${CMAKE_CURRENT_LIST_DIR}/${MY_RELATIVE_PATH_VAR}"
                       ABSOLUTE)
Run Code Online (Sandbox Code Playgroud)