如何在Makefile中使用install命令保持头文件目录结构不变?
解决Makefile头文件迁移保留目录结构的问题
你的问题出在install命令的用法上:直接批量复制文件时,它只会把所有文件放到指定的目标目录,不会自动创建源文件的相对子目录结构。可以通过循环处理每个头文件并使用install -D选项来解决。
修改后的Makefile代码:
THIS_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) all: install_header HEADERS = \ ps_evset.h \ list/list_utils.h \ list/list_traverse.h \ list/list_struct.h install_header: @for header in $(HEADERS); do \ install -D $$header $(THIS_DIR)/../build/include/evsets/$$header; \ done
关键说明:
-D是install命令的核心选项,它会自动创建目标文件路径所需的所有父目录(比如这里的list子目录),然后将源文件复制到对应的目标位置。- 循环遍历每个头文件,确保每个文件都按照原有的相对路径被放置到目标目录下,最终会生成你需要的结构:
evsets/ ├── list │ ├── list_struct.h │ ├── list_traverse.h │ └── list_utils.h └── ps_evset.h - 加上
@符号可以避免循环中的命令被打印到终端,让输出更干净。
另外,如果你习惯用cp命令,也可以用cp --parents实现相同效果,但install命令会自动设置文件的权限(默认是755/644),更符合安装文件的规范:
install_header: mkdir -p $(THIS_DIR)/../build/include/evsets cp --parents $(HEADERS) $(THIS_DIR)/../build/include/evsets/
内容的提问来源于stack exchange,提问作者Gerrie
相关产品推荐
相关产品推荐

