2016-08-18 282 views
7

在CMake的,你可以使用CMake的:转换相对路径绝对路径,以构建目录作为当前目录

get_filename_component(ABSOLUTE_PATH ${RELATIVE_PATH} ABSOLUTE) 

然而,如../../other_program/路径是基于源目录转换为绝对路径相对路径(即CMakeLists.txt文件所在的目录),而不是构建目录(即调用cmake的目录)。如果您将相对路径作为命令行选项,这可能会导致一些混淆。

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

回答

7

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}") 
+0

是,这种解决方案非常适合CMake的版本3.4及更高版本。对于较早的CMake版本(低至2.6版本),mike.did的解决方案是处理它的最好方法。 –

3

您可以使用if(IS_ABSOLUTE path)检查路径是否绝对路径,并且它不是预先设置所需的基础目录。例如,

if(NOT IS_ABSOLUTE ${p}) 
    set(p "${CMAKE_CURRENT_BINARY_DIR}/${p}") 
endif() 
3
get_filename_component(MY_RESULT_ABSOLUTE_PATH_VAR 
         "${CMAKE_CURRENT_LIST_DIR}/${MY_RELATIVE_PATH_VAR}" 
         ABSOLUTE) 
+0

此语法不存在 – korbes

+0

https://cmake.org/cmake/help/v3.0/command/get_filename_component.html https://cmake.org/cmake/help/v3。0/variable/CMAKE_CURRENT_LIST_DIR.html ABSOLUTE_PATH - 目标变量; RELATIVE_PATH - 带有部分路径的源变量 – tvorez

+0

我的不好。请编辑问题以使变量清晰,以便我可以删除我的downvote。 – korbes