Makefile头依赖项

Hug*_*urd 4 makefile

我是使用make的新手,并且通过本教程学习了基础知识.这是教程中最后一个示例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)/*~ 
Run Code Online (Sandbox Code Playgroud)

这应该可以正常工作,假设所有.c文件只包含hellomake.h,但如果每个.c文件包含不同的标题,它将无法正常工作.是否可以编写一个知道每个.c文件包含什么的makefile,所以我不必像以下那样手动执行:

foo.o: foo.c something.h
    ...

bar.o: bar.c somethingelse.h
    ...
Run Code Online (Sandbox Code Playgroud)

因为这似乎是浪费大量时间.

Bet*_*eta 14

假设foo.c有一条线:

#include "something.h"
Run Code Online (Sandbox Code Playgroud)

你想在makefile中添加一行:

foo.o: foo.c something.h
Run Code Online (Sandbox Code Playgroud)

gcc编译器可以为您构造该行.命令

gcc -MMD -c -o foo.o foo.c
Run Code Online (Sandbox Code Playgroud)

将构建foo.ofoo.d包含该行.(试试吧.)

所以只需修改你的makefile来生成这些*.d文件并包含它们,你就完成了:

$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -MMD -c -o $@ $< $(CFLAGS)

-include $(ODIR)/*.d
Run Code Online (Sandbox Code Playgroud)

(可以进一步改进,比如指定*.d文件的位置.)