我有以下 MakeFile:
TARGET = target
CC = gcc-9
CFLAGS = -g -std=c99 -Wall -Wvla -Wextra -Wundef -Wshadow -Wpointer-arith -O2 -D_FORTIFY_SOURCE=2
OBJ = dep1.o $(TARGET).o dep2.o
all: $(TARGET)
run: $(TARGET)
./$<
$(TARGET): $(OBJ)
$(CC) $(CFLAGS) $^ -o $@
$(TARGET).o: $(TARGET).c
$(CC) -c $(CFLAGS) $^
dep1.o: dep1.c
$(CC) -c $(CFLAGS) $^
dep2.o: dep2.c
$(CC) -c $(CFLAGS) $^
dep1.c: dep1.h
$(TARGET).c: dep1.h
clean:
rm -rfv $(TARGET) *.o *.a *.dylib *.dSYM
更改時dep1.h,我希望能夠使用所涉及的新更改重新編譯。dep1.c包括dep1.h. $(TARGET)還包括dep1.h
我在網上嘗試了其他幾種解決方案,但似乎都沒有真正奏效。我能夠讓它作業的唯一方法是改變all: clean $(TARGET). 通過這樣做,專案將首先被清理,然后它會使用新的更改重新編譯dep1.h,但我覺得這是一個非常hacky的解決方案并且有更好的方法,但我不確定。
uj5u.com熱心網友回復:
這是不正確的:
dep1.c: dep1.h
$(TARGET).c: dep1.h
C 檔案不依賴于 H 檔案。說 C 檔案依賴于 H 檔案意味著您使用 H 檔案來創建 C 檔案。實際上,目標檔案同時依賴于 H 和 C 檔案。
dep1.o: dep1.c dep1.h
這是手動撰寫它的方式。您不需要撰寫規則,隱式規則很好,但是為此撰寫顯式規則的正確方法需要使用$<而不是$^,因為$^包含所有依賴項(包括頭檔案)。該$<變數只包含第一個輸入,所以必須先在依賴項中撰寫 C 檔案。
dep1.o: dep1.c dep1.h
$(CC) -c $(CFLAGS) $<
-M如果您的編譯器支持它們(GCC 支持,并且許多其他編譯器以兼容的方式支持它們),則可以使用標志自動處理此問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434836.html
上一篇:如何將十六進制表示為有符號并執行操作?米斯拉10.1
下一篇:strcasecmp實作不列印
