我有很多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