2012-03-07 73 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