在Makefile中,依賴關(guān)系是通過指定目標(biāo)文件和它們所依賴的源文件或其他目標(biāo)文件來處理的
targets: prerequisites
[TAB] recipe
例如,一個(gè)簡單的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
隱式規(guī)則:當(dāng)Makefile中沒有明確指定目標(biāo)文件和依賴關(guān)系時(shí),make會(huì)自動(dòng)應(yīng)用隱式規(guī)則。隱式規(guī)則基于文件名模式和后綴來推斷依賴關(guān)系。例如,make可以自動(dòng)將.c
文件編譯為.o
文件。默認(rèn)情況下,make已經(jīng)定義了許多隱式規(guī)則,但你也可以在Makefile中添加自定義的隱式規(guī)則。
變量和模式:使用變量和模式可以簡化Makefile并提高其可維護(hù)性。例如,使用$@
表示目標(biāo),$<
表示依賴項(xiàng)列表中的第一個(gè)文件,$^
表示所有依賴項(xiàng)。
自動(dòng)生成依賴關(guān)系:通過使用編譯器(如gcc)的特定選項(xiàng)(如-M
),可以自動(dòng)生成源文件之間的依賴關(guān)系。這樣可以確保在修改頭文件時(shí)重新編譯相關(guān)的源文件。例如:
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
include $(SRCS:.c=.d)
總之,處理Makefile中的依賴關(guān)系需要熟練掌握顯式規(guī)則、隱式規(guī)則、變量和模式以及自動(dòng)生成依賴關(guān)系等技巧。這將有助于編寫更簡潔、可維護(hù)的Makefile。