Makefile d 自動依賴

2021-06-22 22:42:28 字數 2245 閱讀 7823

檔案:

bin     main.d  makefile   test.c  test.h  tm.c  tm.o

main.c  main.o  makefile~  test.d  test.o  tm.d

-------------------------------------------

src := $(wildcard *.c)

objs := $(patsubst %.c, %.o, $(src))

all: bin

%d : %c

set -e; rm -f $@; \

$(cc) -mm $< > $@.$$$$; echo $@; \

sed 's,\($*\)o[:]*,\1o $@ :,g' < $@.$$$$ > $@; \

rm -f $@.$$$$

sinclude $(src:.c=.d)

bin : $(objs)

echo $^

$(cc) -o bin $^

clean:

rm -f *.o bin *.d *.d.*

展開為:

src := $(wildcard *.c)

objs := $(patsubst %.c, %.o, $(src))

all: bin

%d : %c

set -e; rm -f $@; \

$(cc) -mm $< > $@.$$$$; echo $@; \

sed 's,\($*\)o[:]*,\1o $@ :,g' < $@.$$$$ > $@; \

rm -f $@.$$$$

test.o test.d : test.c test.h

bin : $(objs)

echo $^

$(cc) -o bin $^

clean:

rm -f *.o bin *.d *.d.*

sed 's,\($*\)o[:]*,\1o $@ :,g' < $@.$$$$ > $@; \

解析:sample:

前:test.o: test.c test.h

後:test.o test.d : test.c test.h

$@ 表示 main.d test.d tm.d 中的main.d或 test.d, 或 tm.d, 每次只能成為乙個。 %d:%c中的目標 %d的值。

$^ 表示集合 main.o test.o tm.o

$《表示依賴 %c的值, main.c或test.c或tm.c

test.o test.d : test.c test.h

表明test.o編譯會關係到test.d, 而test.d又關聯到test.c和test.h,所以只要test.c所引用到的標頭檔案有所修改,都會重新編譯test.o和test.d

執行結果:

set -e; rm -f tm.d; \

cc -mm tm.c > tm.d.$$; echo tm.d; \

sed 's,\(tm.\)o[:]*,\1o tm.d :,g' < tm.d.$$ > tm.d; \

rm -f tm.d.$$

tm.d

set -e; rm -f test.d; \

cc -mm test.c > test.d.$$; echo test.d; \

sed 's,\(test.\)o[:]*,\1o test.d :,g' < test.d.$$ > test.d; \

rm -f test.d.$$

test.d

set -e; rm -f main.d; \

cc -mm main.c > main.d.$$; echo main.d; \

sed 's,\(main.\)o[:]*,\1o main.d :,g' < main.d.$$ > main.d; \

rm -f main.d.$$

main.d

cc    -c -o main.o main.c

cc    -c -o test.o test.c

cc    -c -o tm.o tm.c

echo main.o test.o tm.o

main.o test.o tm.o

cc -o bin main.o test.o tm.o

root@commander-lifebook-lh531:/home/samba/proj# cat test.d

test.o test.d : test.c test.h

自動生成依賴關係

值得思考的問題 目標檔案.o是否只依賴於原始檔.c?編譯器是如何編譯原始檔和標頭檔案的?解答 預處理器將標頭檔案的 直接插入原始檔,編譯器只通過預處理器的原始檔產生目標檔案。如果規則中以原始檔為依賴,命令可能無法執行。因為在修改 的時候有可能只改動了標頭檔案,原始檔沒有被修改。如果規則中只是以原始檔...

makefile自動產生依賴

makefile 中,可能需要書寫一些規則來描述乙個 o目標檔案和標頭檔案的依賴關係。例如,如果在 main.c 中使用 include defs.h 那麼我們可能需要如下那樣的乙個規則來描述當頭檔案 defs.h 被修改以後執行 make 目標 main.o 應該被重建。main.o defs.h...

Spring DI依賴注入,自動裝配

依賴注入 說白了,就是給類中的屬性賦值操作 1 構造注入 2 setter注入 2.1 value 直接注入的真實的 值 2.2 ref bean的id,可以說是引用 2.3 陣列注入 2.4 list注入 2.5 map注入 2.6 set注入 2.7 null注入 2.8 properties ...