在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。