我有以下目录结构:
root-----Makefile
|-----src #all source files here.
|-----obj #all object files here.
|-----bin #the final target.
Makefile
的内容如下:
TARGET = exec
CC = gcc
CFLAGS = -g -I.
LINKER = gcc -o
LFLAGS = -I. -lm -lpthread
BINDIR = bin
OBJDIR = obj
SRCDIR = src
INTERFACE = interface
STD = -std=c99
PROGRAMSOURCES := $(wildcard $(SRCDIR)/*.c)
PROGRAMINTERFACE:= $(wildcard $(INTERFACE)/*.h)
OBJECTS := $(PROGRAMSOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
$(BINDIR)/$(TARGET) : $(OBJECTS)
$(LINKER) $@ $(LFLAGS) $(OBJECTS) $(STD)
#pull the dependencies to the .o files
-include $(OBJECTS:.o=.d)
$(OBJECTS) : $(OBJDIR)/%.o :$(SRCDIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@ $(STD)
$(CC) $(CFLAGS) -MM $< > $*.d
@mv -f $*.d $*.d.tmp
@sed -e 's|.*:|$(OBJDIR)/$*.o:|' < $*.d.tmp > $*.d
@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
sed -e 's/^ *//' -e 's/$$/:/' >> $*.d`
@rm -f $*.d.tmp`
.PHONY : run
run :`
./$(BINDIR)/$(TARGET) ${TYPE} ${INP_FILE}
我已使用教程here进行了修改以适应相应的目录结构。但是在修改中出现了问题,我无法理解。 .d
文件中生成的依赖关系列表不考虑即,如果我更改了.h
规则未编译。
答案 0 :(得分:0)
您似乎在root/
中生成依赖项文件,但在obj/
中查找它们。
尝试更改此内容:
-include $(OBJECTS:.o=.d)
到此:
-include *.d
makefile工作后,您可以进行其他改进。
编辑:进一步改进
1)选择放置依赖项文件的位置主要是任意的,但是如果我们将它们放在obj/
中,我们可以非常简化$(OBJECTS)
规则:
-include $(OBJDIR)/*.d
$(OBJECTS): $(OBJDIR)/%.o :$(SRCDIR)/%.c
$(CC) $(CFLAGS) -MMD -MP -c $< -o $@ $(STD)
2)PROGRAMINTERFACE
和INTERFACE
未使用,因此我们可以删除它们。
3)将-o
放在LINKER
中是很危险的。并且不要忘记自动变量$^
:
LINKER = gcc
$(BINDIR)/$(TARGET) : $(OBJECTS)
$(LINKER) $@ $(LFLAGS) $^ $(STD)
4)给run
一个先决条件是明智的:
run: $(BINDIR)/$(TARGET)
./$< ${TYPE} ${INP_FILE}