【发布时间】:2023-04-06 04:42:01
【问题描述】:
[编辑]- 答案是我错误地定义了包含目录的路径。令人尴尬的错误。
我正在编写一个 makefile,它从 src 目录中的 .c 文件构建对象,头文件位于包含目录中,并将它们存储在 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 所在的目录如下所示(当你 ls 时)
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 文件?
提前致谢
【问题讨论】:
-
make -d在尝试构建该文件时会说什么?您确定所有列出的源文件和头文件都在正确的目录中吗?