如何通过CMake实现嵌套结构头文件的正确安装?
问题描述
我用CMake构建静态库项目时,头文件安装不符合预期。项目文件结构如下:
. ├── modules | ├── util1.cpp | ├── util2.cpp │ ├── module_a | | ├── file1.cpp | | └── file2.cpp │ └── module_b | ├── file3.cpp | └── file4.cpp └── include ├── util1.hpp ├── util2.hpp ├── module_a | ├── file1.hpp | └── file2.hpp └── module_b ├── file3.hpp └── file4.hpp
核心代码在modules及其子目录,include目录结构和modules对应。目前我逐个指定头文件安装:
set(PROJECT_INCLUDES ${PROJECT_SOURCE_DIR}/include/util1.hpp ${PROJECT_SOURCE_DIR}/include/util2.hpp ${PROJECT_SOURCE_DIR}/include/module_a/file1.hpp ${PROJECT_SOURCE_DIR}/include/module_a/file2.hpp ${PROJECT_SOURCE_DIR}/include/module_b/file3.hpp ${PROJECT_SOURCE_DIR}/include/module_b/file4.hpp )
安装后只能这样引用:
#include <myproj/util1.hpp> #include <myproj/file1.hpp> #include <myproj/file3.hpp>
但希望实现嵌套路径引用:
#include <myproj/util1.hpp> #include <myproj/module_a/file1.hpp> #include <myproj/module_b/file3.hpp>
解决方案
直接保留include目录的原始结构进行安装即可,不需要逐个指定头文件,推荐用install(DIRECTORY)命令实现:
# 安装include目录下的所有.hpp文件,保留原目录结构到目标路径include/myproj install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION include/myproj FILES_MATCHING PATTERN "*.hpp")
关键说明:
DIRECTORY参数后加斜杠include/,表示复制目录内的内容而非目录本身;如果不加斜杠,会把整个include目录复制到include/myproj下,导致引用路径变成<myproj/include/util1.hpp>,不符合需求。FILES_MATCHING PATTERN "*.hpp"确保只安装头文件,避免复制目录内的其他无关文件。- 安装完成后,头文件会按照原结构部署到
安装路径/include/myproj/下,其中module_a、module_b子目录会被完整保留,自然就能通过嵌套路径引用。
如果需要更精细的控制(比如排除某些文件),也可以用遍历的方式实现:
# 递归收集所有.hpp头文件 file(GLOB_RECURSE PROJECT_INCLUDES "${PROJECT_SOURCE_DIR}/include/*.hpp") foreach(header ${PROJECT_INCLUDES}) # 计算头文件相对于include目录的相对路径 file(RELATIVE_PATH rel_path ${PROJECT_SOURCE_DIR}/include ${header}) # 按相对路径安装到目标目录 install(FILES ${header} DESTINATION include/myproj/${rel_path}) endforeach()
内容的提问来源于stack exchange,提问作者aaries
相关产品推荐
相关产品推荐

