如何让Make编译目标依赖头文件且仍使用$^变量?
解决Makefile中目标依赖头文件但编译不传入头文件的问题
当然有两全其美的办法!我平时写Makefile也常碰到这个场景,最直接优雅的方式是把源文件单独定义成变量,这样既不用重复编写源文件名,又能让目标正确依赖头文件,编译时也不会把头文件传入命令。
优化后的Makefile写法
# 定义源文件变量,后续维护只需修改这里 SRCS := source1.cpp source2.cpp # 定义依赖的头文件 HEADERS := header.hpp mybin.a: $(SRCS) $(HEADERS) g++ $(SRCS) -o $@
为什么这能解决问题?
- 目标
mybin.a明确依赖了所有源文件和头文件,只要头文件header.hpp被修改,Make就会自动重新编译目标,完全满足依赖检测的需求。 - 编译命令里使用
$(SRCS)变量,只会传入源文件,彻底避免了把头文件不必要地传给g++的问题。 - 后续如果要添加新的源文件或头文件,只需要修改
SRCS或HEADERS变量即可,不用改动编译命令,项目维护性大大提升。
进阶小技巧
如果你的项目有多个头文件,还可以用通配符批量匹配,省去逐个手动添加的麻烦:
HEADERS := $(wildcard *.hpp)
这条命令会自动把当前目录下所有.hpp格式的头文件加入依赖列表。
内容的提问来源于stack exchange,提问作者Tohiko
相关产品推荐
相关产品推荐

