我无法将目标文件添加到目录中;我相信我可以一项一项地完成,但这会失去主要的兴趣,即它的自动性。
CC=gcc
CFLAGS=-Wall -Iinclude
vpath %.c src
vpath %.h include
SRC = src
INCLUDE = include
TARGET=sokoban
TOZIP= $(wildcard $(SRC)/*.c) $(wildcard $(INCLUDE)/*h)
OBJ= game.o main.o
DOCGEN = doxygen
DOCPATH = doc
DOXYFILE = $(DOCPATH)/Doxyfile
LIBNAME=sokobanLibrary.zip
.PHONY: all doc archive run clean
all: build archive doc run
build: $(TARGET)
$(TARGET): $(OBJ)
$(CC) $(CFLAGS) -o $@ $^ -lm
%.o: %.c
$(CC) $(CFLAGS) -c $<
archive:
zip $(LIBNAME) $(TOZIP)
run: $(TARGET)
./$(TARGET)
doc:
$(DOCGEN) $(DOXYFILE) -o $(DOCPATH)
clean:
rm -f $(OBJ) $(TARGET) $(LIBNAME)
rm -r doc/html
rm -r doc/latex
您可以修改 Makefile,通过在单独的目录中组织源文件和目标文件来实现此目的。
我在这里更新了你的 Makefile:
CC=gcc
CFLAGS=-Wall -Iinclude
vpath %.c src
vpath %.h include
SRC = src
INCLUDE = include
OBJDIR = obj
TARGET=sokoban
TOZIP= $(wildcard $(SRC)/*.c) $(wildcard $(INCLUDE)/*.h)
OBJ= $(patsubst $(SRC)/%.c,$(OBJDIR)/%.o,$(wildcard $(SRC)/*.c))
DOCGEN = doxygen
DOCPATH = doc
DOXYFILE = $(DOCPATH)/Doxyfile
LIBNAME=sokobanLibrary.zip
.PHONY: all doc archive run clean
all: build archive doc run
build: $(TARGET)
$(TARGET): $(OBJ)
$(CC) $(CFLAGS) -o $@ $^ -lm
$(OBJDIR)/%.o: $(SRC)/%.c | $(OBJDIR)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR):
mkdir -p $(OBJDIR)
archive:
zip $(LIBNAME) $(TOZIP)
run: $(TARGET)
./$(TARGET)
doc:
$(DOCGEN) $(DOXYFILE) -o $(DOCPATH)
clean:
rm -rf $(OBJDIR) $(TARGET) $(LIBNAME) doc/html doc/latex
此修改引入了一个单独的 obj 目录来存储目标文件。构建目标文件的模式规则确保它们放置在
obj
目录中。 $(OBJDIR)
目标确保目录存在。