[edit] - 答案是我错误地定义了include目录的路径。尴尬的错误。
我正在编写一个makefile,它在src目录中的.c文件中构建对象,并在include目录中包含头文件,并将它们存储在obj目录中,然后从这些对象构建和exe。玩具版本如下。
# Makefile
IDIR = ../include
CC = gcc
CFLAGS = -I$(IDIR) -Wall
SDIR = src
ODIR = obj
_SOURCES = main.c aux1.c aux2.c aux3.c
SOURCES = $(patsubst %,$(SDIR)/%,$(_SOURCES))
_OBJECTS = $(_SOURCES:.c=.o)
OBJECTS = $(patsubst %,$(ODIR)/%,$(_OBJECTS))
_DEPS = aux1.h aux2.h aux3.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
EXE = exefile
$(ODIR)/%.o: $(SDIR)/%.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
$(EXE): $(OBJECTS)
$(CC) -o $@ $^ $(CFLAGS)
.PHONY: clean
clean:
rm *o $(EXE)
makefile所在的目录看起来像这样(当你的时候)
include Makefile obj src trash
当我输入make时,我收到以下错误
make: *** No rule to make target `obj/main.o', needed by `exefile'. Stop.
我怀疑问题在于这一行
$(ODIR)/%.o: $(SDIR)/%.c $(DEPS)
我试图通过在src /中引用相应的源文件来构建obj /中的每个目标文件,但该行似乎做了其他事情。是这样的吗?是否有一种简单的方法可以在源目录中引用.c文件而无需“输入”目录?
提前致谢
答案 0 :(得分:1)
我相信你的问题是$(DEPS)
依赖。
您将IDIR
设置为../include
,但是从顶级目录(运行make的位置)设置该路径不正确。