2012-03-07 69 views
1

我有很多C文件,有些文件頭(.h),有些文件不是。如何管理C頭文件依賴關係?

這裏是我的makefile:

.SUFFIXES: 

SRC := $(wildard ./src/*.c) 
OBJ := $(SRC:%.c=%.o) 

all: $(OBJ) 

%.o: %.c 
    $(MyNotGCCCompiler) "@../$(*F).cmd" 

它工作正常,只是如果我改變一個頭文件,目標不會重新編譯,因爲依賴不包括在內。

我該如何管理這種情況?

感謝

回答

2

標準方法是在編譯時自動生成標題依賴關係。

對於第一次編譯,不需要依賴項,因爲每個源文件都必須被編譯。隨後的重新編譯會加載先前編譯生成的依賴關係,以確定需要重新編譯的內容。

您的$(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) 
0

(我不知道這是怎麼不說明明顯,但無論如何:)

按文件添加規則,列出這些依賴關係明確,文件。 最好在一個單獨的makefile中包含主文件。

存在的工具(如gcc)可以爲您生成它們;如果你不能使用或建立這樣的工具,你需要自己維護這些規則。

+0

Makefile中是通用的,在幾個項目中使用。有太多的文件有頭文件以便手動維護。 – 2012-03-07 09:32:53

+0

這就是爲什麼您必須生成此文件並將其包含在通用Makefile中。這是像GNU autotools和CMake這樣的工具存在的原因之一。 – reinierpost 2012-03-07 09:58:24

+0

@reinierpost:由於可移植性原因,這些工具的存在多於生成依賴關係。 – 2012-03-08 21:10:35