我是使用 make 的新手,并且一直在通过 this tutorial 学习基础知识。这是教程中的最后一个 makefile 示例:
IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=obj
LDIR =../lib
LIBS=-lm
_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = hellomake.o hellofunc.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
假设所有 .c 文件只包含 hellomake.h,这应该可以正常工作,但如果每个 .c 文件都包含不同的 header ,则它不起作用。是否可以编写一个知道每个 .c 文件包含的内容的 makefile,这样我就不必像下面这样手动操作:
foo.o: foo.c something.h
...
bar.o: bar.c somethingelse.h
...
因为这似乎是在浪费时间。
最佳答案
假设 foo.c
有一行:
#include "something.h"
你希望在 makefile 中有一行:
foo.o: foo.c something.h
gcc 编译器可以为您构造该行。命令
gcc -MMD -c -o foo.o foo.c
将构建包含该行的
foo.o
和 foo.d
。 (尝试一下。)因此,只需修改您的 makefile 以生成这些 *.d 文件并包含它们,您就完成了:
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -MMD -c -o $@ $< $(CFLAGS)
-include $(ODIR)/*.d
(进一步的改进是可能的,比如指定 *.d 文件应该去哪里。)
关于Makefile 头文件依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15725789/