如何在目录中添加目标文件而不失去自动化

问题描述 投票:0回答:1

我无法将目标文件添加到目录中;我相信我可以一项一项地完成,但这会失去主要的兴趣,即它的自动性。

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
c bash makefile
1个回答
0
投票

您可以修改 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)
目标确保目录存在。

© www.soinside.com 2019 - 2024. All rights reserved.