2026/4/16 14:00:28
网站建设
项目流程
甘肃网站优化,做电子商务网站实验总结,简述企业注册的流程,网站建设前台功能目录
1.简介
2.最常用的 5 种解析模式
2.1.DIRECTORY
2.2.NAME
2.3.NAME_WE (Name Without Extension)
2.4.EXT
2.5.ROOT
3.使用场景
3.1.多级路径向上推导#xff08;写XXXConfig.cmake必用#xff09;
3.2.规范化路径#xff08;去除./../#xff0c;转为绝对路…目录1.简介2.最常用的 5 种解析模式2.1.DIRECTORY2.2.NAME2.3.NAME_WE (Name Without Extension)2.4.EXT2.5.ROOT3.使用场景3.1.多级路径向上推导写XXXConfig.cmake必用3.2.规范化路径去除./../转为绝对路径3.3.提取文件名 后缀分离3.4.配合CMAKE_CURRENT_LIST_DIR拼接路径4.注意事项5.完整可复用自定义XXXConfig.cmake中的路径推导模板1.简介CMake进阶vcpkg中OpenSSLConfig.cmake详解get_filename_component是CMake 内置核心命令不是变量也是实现「第三方库路径自动推导」的核心专门用于解析 / 提取文件路径、目录路径、文件名、后缀名等路径相关信息是实现跨平台路径处理、编写通用XXXConfig.cmake/CMakeLists.txt的必备命令没有之一。语法get_filename_component(输出变量名 待解析的路径 解析模式 [ABSOLUTE] [REALPATH])参数说明输出变量名解析后的结果存入这个变量中供后续使用待解析的路径可以是文件路径、目录路径支持相对路径 / 绝对路径解析模式核心指定要解析的内容大小写不敏感有 7 种常用模式重点记前 5 个高频的[ABSOLUTE]可选但几乎必加将解析后的相对路径转为绝对路径CMake 路径处理推荐一律用绝对路径避免各种路径错误[REALPATH]可选解析出真实路径会解析软链接 / 快捷方式、去除路径中的.//../跨平台兼容性更强。2.最常用的 5 种解析模式2.1.DIRECTORY提取传入路径对应的上级目录路径文件 / 目录路径都能解析如果传入的是「文件路径」→ 提取该文件所在的目录如果传入的是「目录路径」→ 提取该目录的上级目录以目录 D:/project/thirdparty/xxx/lib/cmake/xxx/XXXConfig.cmake 为例 # 示例传入 配置文件的绝对路径 ${CMAKE_CURRENT_LIST_FILE}就是当前脚本自身路径 get_filename_component(CONFIG_DIR ${CMAKE_CURRENT_LIST_FILE} DIRECTORY) # 结果CONFIG_DIR D:/project/thirdparty/xxx/lib/cmake/xxx # 简写PATH 和 DIRECTORY 完全等价推荐写DIRECTORY语义更清晰 get_filename_component(CONFIG_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)2.2.NAME提取传入路径的「文件名」包含后缀不管传入的是文件还是目录get_filename_component(FILE_NAME ${CMAKE_CURRENT_LIST_FILE} NAME) # 结果FILE_NAME XXXConfig.cmake # 如果传入目录路径 get_filename_component(DIR_NAME D:/project/thirdparty/xxx/lib NAME) # 结果DIR_NAME lib2.3.NAME_WE(Name Without Extension)提取文件名不含后缀仅对文件路径有效目录路径用这个无意义get_filename_component(FILE_NAME_NO_EXT ${CMAKE_CURRENT_LIST_FILE} NAME_WE) # 结果FILE_NAME_NO_EXT XXXConfig2.4.EXT提取文件的后缀名带.仅对文件路径有效get_filename_component(FILE_EXT ${CMAKE_CURRENT_LIST_FILE} EXT) # 结果FILE_EXT .cmake2.5.ROOT提取路径的根目录比如 Windows 的D:/Linux/macOS 的/get_filename_component(ROOT_DIR ${CMAKE_CURRENT_LIST_FILE} ROOT) # Windows结果ROOT_DIR D:/ # Linux/macOS结果ROOT_DIR /3.使用场景3.1.多级路径向上推导写XXXConfig.cmake必用在自定义XXXConfig.cmake中通过「配置文件自身路径」自动向上推导整个库的根目录、头文件目录、库文件目录、bin 目录无需硬编码任何路径实现「库放在任意位置都能被 CMake 自动识别」也是所有官方XXXConfig.cmake的标准写法。你的XXXConfig.cmake的标准存放路径thirdparty/xxx/ # 库的根目录我们最终要推导的 ├── include/ # 头文件目录需要推导 ├── lib/ # 库文件目录需要推导 │ └── cmake/ │ └── xxx/ # 库名目录 │ └── XXXConfig.cmake # 当前脚本自身 └── bin/ # DLL/SO动态库目录需要推导核心目标在XXXConfig.cmake中从脚本自身路径出发推导出上面所有目录完全无硬编码。# 1. 获取当前XXXConfig.cmake脚本自身的绝对路径CMAKE_CURRENT_LIST_FILE是脚本自身路径 # 路径thirdparty/xxx/lib/cmake/xxx/XXXConfig.cmake get_filename_component(_XXX_CONFIG_DIR ${CMAKE_CURRENT_LIST_FILE} DIRECTORY ABSOLUTE) # 2. 向上1级 → cmake/xxx 目录 # 路径thirdparty/xxx/lib/cmake/xxx get_filename_component(_XXX_CMAKE_SUB_DIR ${_XXX_CONFIG_DIR} DIRECTORY ABSOLUTE) # 3. 向上1级 → cmake 目录 # 路径thirdparty/xxx/lib/cmake get_filename_component(_XXX_CMAKE_DIR ${_XXX_CMAKE_SUB_DIR} DIRECTORY ABSOLUTE) # 4. 向上1级 → lib 目录 # 路径thirdparty/xxx/lib get_filename_component(_XXX_LIB_DIR ${_XXX_CMAKE_DIR} DIRECTORY ABSOLUTE) # 5. 向上1级 → 库的根目录【最终核心】 # 路径thirdparty/xxx get_filename_component(_XXX_ROOT_DIR ${_XXX_LIB_DIR} DIRECTORY ABSOLUTE) # ✅ 最终通过根目录拼接出所有需要的目录固定写法永不失效 set(_XXX_INCLUDE_DIR ${_XXX_ROOT_DIR}/include) # 头文件目录 set(_XXX_BIN_DIR ${_XXX_ROOT_DIR}/bin) # 动态库运行目录 set(_XXX_LIB_DIR ${_XXX_ROOT_DIR}/lib) # 静态/导入库目录3.2.规范化路径去除./../转为绝对路径有时候路径中会有./或../导致路径不规范用get_filename_componentABSOLUTEREALPATH可以一键规范化# 原始路径有../不规范 set(RAW_PATH ./thirdparty/../xxx/lib) # 规范化为绝对路径去除../ get_filename_component(NORMAL_PATH ${RAW_PATH} DIRECTORY ABSOLUTE REALPATH)3.3.提取文件名 后缀分离处理配置文件、源码文件时常用set(FILE_PATH D:/project/src/main.cpp) get_filename_component(FILE_NAME ${FILE_PATH} NAME) # main.cpp get_filename_component(FILE_NAME_WE ${FILE_PATH} NAME_WE) # main get_filename_component(FILE_EXT ${FILE_PATH} EXT) # .cpp3.4.配合CMAKE_CURRENT_LIST_DIR拼接路径和之前CMAKE_CURRENT_LIST_DIR完美配合实现跨平台路径拼接# 拼接当前脚本同级的config目录 get_filename_component(CONFIG_DIR ${CMAKE_CURRENT_LIST_DIR}/config DIRECTORY ABSOLUTE)4.注意事项1.DIRECTORY和PATH完全等价CMake 官方定义这两个模式是同一个意思推荐写DIRECTORY语义更清晰一眼看出是「提取目录」。2.强烈建议永远加上ABSOLUTE参数CMake 中路径分「相对路径」和「绝对路径」相对路径容易因为CMAKE_CURRENT_SOURCE_DIR/CMAKE_CURRENT_BINARY_DIR的变化导致路径错误所有路径处理都用绝对路径是 CMake 的最佳实践。3.路径分隔符自动跨平台兼容get_filename_component会自动适配 Windows 的\和 Linux/macOS 的/你在代码中写/即可CMake 会自动转换为对应系统的分隔符无需手动处理。4.变量名建议加下划线前缀私有变量推导路径时的临时变量比如_XXX_CONFIG_DIR、_XXX_ROOT_DIR建议加下划线前缀表示这是脚本内的私有变量避免和外部用户定义的变量重名冲突这是 CMake 官方的编码规范。5.多级推导的顺序不能乱向上推导目录时必须从脚本自身路径开始逐级向上不能跳过层级否则会推导错误。5.完整可复用自定义XXXConfig.cmake中的路径推导模板# # XXXConfig.cmake 通用路径推导模板 (替换XXX为你的库名) # 配置文件路径xxx/lib/cmake/xxx/XXXConfig.cmake # # 1. 从脚本自身路径逐级向上推导库根目录 get_filename_component(_XXX_CONFIG_DIR ${CMAKE_CURRENT_LIST_FILE} DIRECTORY ABSOLUTE) get_filename_component(_XXX_LIB_CMAKE_DIR ${_XXX_CONFIG_DIR} DIRECTORY ABSOLUTE) get_filename_component(_XXX_LIB_DIR ${_XXX_LIB_CMAKE_DIR} DIRECTORY ABSOLUTE) get_filename_component(_XXX_ROOT_DIR ${_XXX_LIB_DIR} DIRECTORY ABSOLUTE) # 2. 定义库的核心目录固定写法 set(XXX_INCLUDE_DIRS ${_XXX_ROOT_DIR}/include CACHE PATH XXX头文件目录) set(XXX_LIBRARY_DIRS ${_XXX_ROOT_DIR}/lib CACHE PATH XXX库文件目录) set(XXX_BIN_DIR ${_XXX_ROOT_DIR}/bin CACHE PATH XXX动态库运行目录) set(XXX_ROOT_DIR ${_XXX_ROOT_DIR} CACHE PATH XXX库根目录) # 3. 验证目录存在性报错提示可选但推荐 if(NOT EXISTS ${XXX_INCLUDE_DIRS}) message(FATAL_ERROR XXX头文件目录不存在: ${XXX_INCLUDE_DIRS}) endif() if(NOT EXISTS ${XXX_LIBRARY_DIRS}) message(FATAL_ERROR XXX库文件目录不存在: ${XXX_LIBRARY_DIRS}) endif()