如何在CMake中获取路径的父目录路径?

ztyzrc3y  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(200)

如何在CMake中找到父目录?
假设${MYPROJECT_DIR}=/dir1/dir2/dir3/myproject/,我想要${PARENT_DIR}=/dir1/dir2/dir3/
SET(PARENT_DIR ${MYPROJECT_DIR}/../)似乎不是正确的语法。

pengsaosao

pengsaosao1#

对于CMake 3.20和更新版本,推荐的方法是使用带有PARENT_PATH选项的cmake_path:

cmake_path(GET MYPROJECT_DIR PARENT_PATH PARENT_DIR)

字符串
对于CMake 2.8.12之前的旧版本,请使用get_filename_component命令和DIRECTORY选项:

get_filename_component(PARENT_DIR ${MYPROJECT_DIR} DIRECTORY)


对于早于2.8.12的CMake版本,请使用PATH选项:

set (MYPROJECT_DIR /dir1/dir2/dir3/myproject/)
get_filename_component(PARENT_DIR ${MYPROJECT_DIR} PATH)

myss37ts

myss37ts2#

从CMake 3.20开始,可以使用cmake_path命令获取给定路径的父目录:

cmake_path(GET <path-var> PARENT_PATH <out-var>)

字符串
此命令取代get_filename_component命令。
所以,在你的例子中,它看起来像这样:

cmake_path(GET MYPROJECT_DIR PARENT_PATH PARENT_DIR)


您也可以先检查路径是否有父目录组件:

cmake_path(HAS_PARENT_PATH MYPROJECT_DIR MyDir_HAS_PARENT)
if(MyDir_HAS_PARENT)
    cmake_path(GET MYPROJECT_DIR PARENT_PATH PARENT_DIR)
endif()


这实际上并不检查文件系统以验证有效路径,但它确实是一个有用的路径操作命令。

wgxvkvu9

wgxvkvu93#

对我来说,它不起作用(在cmake 3.18)。我最终使用:

get_filename_component(VAR_PARENT ${MYPROJECT_DIR}/.. ABSOLUTE)

字符串

wwwo4jvm

wwwo4jvm4#

我添加了Sascha Kratky's above suggestion的“CMakeLists.txt”示例:
让我们假设这是项目文件夹。

project
    |
    |_ src    
    |    |_ CMakeLists.txt 
    |    |_ test.cpp
    |
    |_ include   
         |_ add.hpp

字符串
然后“CMakeLists.txt”将是

cmake_minimum_required(VERSION 3.14.0)
set(project_name Simple)
project(${project_name})

set( cur_path ${CMAKE_CURRENT_SOURCE_DIR} )
cmake_path(GET cur_path PARENT_PATH parent_path)
set( includes ${parent_path}/include )

include_directories( ${includes} )

set( sources ${CMAKE_CURRENT_SOURCE_DIR}/test.cpp )
add_executable( ${project_name} ${sources} )

相关问题