在Makefile中,依赖关系是通过指定目标文件和它们所依赖的源文件或其他目标文件来处理的
targets: prerequisites
[TAB] recipe
例如,一个简单的C程序的Makefile可能如下所示:
myprogram: main.o utils.o
gcc -o myprogram main.o utils.o
main.o: main.c utils.h
gcc -c main.c
utils.o: utils.c utils.h
gcc -c utils.c
隐式规则:当Makefile中没有明确指定目标文件和依赖关系时,make会自动应用隐式规则。隐式规则基于文件名模式和后缀来推断依赖关系。例如,make可以自动将.c
文件编译为.o
文件。默认情况下,make已经定义了许多隐式规则,但你也可以在Makefile中添加自定义的隐式规则。
变量和模式:使用变量和模式可以简化Makefile并提高其可维护性。例如,使用$@
表示目标,$<
表示依赖项列表中的第一个文件,$^
表示所有依赖项。
自动生成依赖关系:通过使用编译器(如gcc)的特定选项(如-M
),可以自动生成源文件之间的依赖关系。这样可以确保在修改头文件时重新编译相关的源文件。例如:
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
include $(SRCS:.c=.d)
总之,处理Makefile中的依赖关系需要熟练掌握显式规则、隐式规则、变量和模式以及自动生成依赖关系等技巧。这将有助于编写更简洁、可维护的Makefile。