我有很多C文件,有些文件頭(.h),有些文件不是。如何管理C頭文件依賴關係?
這裏是我的makefile:
.SUFFIXES:
SRC := $(wildard ./src/*.c)
OBJ := $(SRC:%.c=%.o)
all: $(OBJ)
%.o: %.c
$(MyNotGCCCompiler) "@../$(*F).cmd"
它工作正常,只是如果我改變一個頭文件,目標不會重新編譯,因爲依賴不包括在內。
我該如何管理這種情況?
感謝
我有很多C文件,有些文件頭(.h),有些文件不是。如何管理C頭文件依賴關係?
這裏是我的makefile:
.SUFFIXES:
SRC := $(wildard ./src/*.c)
OBJ := $(SRC:%.c=%.o)
all: $(OBJ)
%.o: %.c
$(MyNotGCCCompiler) "@../$(*F).cmd"
它工作正常,只是如果我改變一個頭文件,目標不會重新編譯,因爲依賴不包括在內。
我該如何管理這種情況?
感謝
標準方法是在編譯時自動生成標題依賴關係。
對於第一次編譯,不需要依賴項,因爲每個源文件都必須被編譯。隨後的重新編譯會加載先前編譯生成的依賴關係,以確定需要重新編譯的內容。
您的$(MyNotGCCCompiler)
很可能有命令行選項來生成依賴關係文件。
當使用gcc
它的工作原理是這樣的:
.SUFFIXES:
SRC := $(wildard ./src/*.c)
OBJ := $(SRC:%.c=%.o)
DEP := $(OBJ:%.o=%.d)
all: $(OBJ)
# when compiling produce a .d file as well
%.o: %.c
gcc -c -o [email protected] $(CPPFLAGS) $(CFLAGS) -MD -MP -MF ${@:.o=.d} $<
# don't fail on missing .d files
# there won't be any on the first run
-include $(DEP)
(我不知道這是怎麼不說明明顯,但無論如何:)
按文件添加規則,列出這些依賴關係明確,文件。 最好在一個單獨的makefile中包含主文件。
存在的工具(如gcc
)可以爲您生成它們;如果你不能使用或建立這樣的工具,你需要自己維護這些規則。
Makefile中是通用的,在幾個項目中使用。有太多的文件有頭文件以便手動維護。 – 2012-03-07 09:32:53
這就是爲什麼您必須生成此文件並將其包含在通用Makefile中。這是像GNU autotools和CMake這樣的工具存在的原因之一。 – reinierpost 2012-03-07 09:58:24
@reinierpost:由於可移植性原因,這些工具的存在多於生成依賴關係。 – 2012-03-08 21:10:35