如何在CMake中找到父目录?假设${MYPROJECT_DIR}=/dir1/dir2/dir3/myproject/,我想要${PARENT_DIR}=/dir1/dir2/dir3/。SET(PARENT_DIR ${MYPROJECT_DIR}/../)似乎不是正确的语法。
${MYPROJECT_DIR}=/dir1/dir2/dir3/myproject/
${PARENT_DIR}=/dir1/dir2/dir3/
SET(PARENT_DIR ${MYPROJECT_DIR}/../)
pengsaosao1#
对于CMake 3.20和更新版本,推荐的方法是使用带有PARENT_PATH选项的cmake_path:
PARENT_PATH
cmake_path(GET MYPROJECT_DIR PARENT_PATH PARENT_DIR)
字符串对于CMake 2.8.12之前的旧版本,请使用get_filename_component命令和DIRECTORY选项:
DIRECTORY
get_filename_component(PARENT_DIR ${MYPROJECT_DIR} DIRECTORY)
型对于早于2.8.12的CMake版本,请使用PATH选项:
PATH
set (MYPROJECT_DIR /dir1/dir2/dir3/myproject/) get_filename_component(PARENT_DIR ${MYPROJECT_DIR} PATH)
型
myss37ts2#
从CMake 3.20开始,可以使用cmake_path命令获取给定路径的父目录:
cmake_path
cmake_path(GET <path-var> PARENT_PATH <out-var>)
字符串此命令取代get_filename_component命令。所以,在你的例子中,它看起来像这样:
get_filename_component
型您也可以先检查路径是否有父目录组件:
cmake_path(HAS_PARENT_PATH MYPROJECT_DIR MyDir_HAS_PARENT) if(MyDir_HAS_PARENT) cmake_path(GET MYPROJECT_DIR PARENT_PATH PARENT_DIR) endif()
型这实际上并不检查文件系统以验证有效路径,但它确实是一个有用的路径操作命令。
wgxvkvu93#
对我来说,它不起作用(在cmake 3.18)。我最终使用:
get_filename_component(VAR_PARENT ${MYPROJECT_DIR}/.. ABSOLUTE)
字符串
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} )
4条答案
按热度按时间pengsaosao1#
对于CMake 3.20和更新版本,推荐的方法是使用带有
PARENT_PATH
选项的cmake_path:字符串
对于CMake 2.8.12之前的旧版本,请使用get_filename_component命令和
DIRECTORY
选项:型
对于早于2.8.12的CMake版本,请使用
PATH
选项:型
myss37ts2#
从CMake 3.20开始,可以使用
cmake_path
命令获取给定路径的父目录:字符串
此命令取代
get_filename_component
命令。所以,在你的例子中,它看起来像这样:
型
您也可以先检查路径是否有父目录组件:
型
这实际上并不检查文件系统以验证有效路径,但它确实是一个有用的路径操作命令。
wgxvkvu93#
对我来说,它不起作用(在cmake 3.18)。我最终使用:
字符串
wwwo4jvm4#
我添加了Sascha Kratky's above suggestion的“CMakeLists.txt”示例:
让我们假设这是项目文件夹。
字符串
然后“CMakeLists.txt”将是
型