【发布时间】:2021-10-09 23:13:35
【问题描述】:
当尝试将编译输出组织到构建目录中时,make 不断删除目标文件。 Makefile 是:
MPI_INSTALLATION=/home/gkaf/Software/MPI
IDIR=$(MPI_INSTALLATION)/include
LDIR=$(MPI_INSTALLATION)/lib
CC=gcc
CFLAGS=-I$(IDIR)
LDFLAGS=-L$(LDIR) -Wl,-rpath=$(LDIR)
BUILD_DIR=build
OBJ_DIR=$(BUILD_DIR)/obj
BIN_DIR=$(BUILD_DIR)/bin
SRC_DIR=src
LIBS=-lmpi
.PHONY: all
all: test-mpi
.PHONY: test-mpi
test-mpi: prepare $(BIN_DIR)/test-mpi
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) -c -o $@ $< $(CFLAGS)
$(BIN_DIR)/%: $(OBJ_DIR)/%.o
$(CC) -o $@ $^ $(LDFLAGS) $(LIBS)
prepare: $(BUILD_DIR) $(OBJ_DIR) $(BIN_DIR)
$(BUILD_DIR):
mkdir -p $(BUILD_DIR)
$(OBJ_DIR):
mkdir -p $(OBJ_DIR)
$(BIN_DIR):
mkdir -p $(BIN_DIR)
.PHONY: clean
clean:
rm -rf $(BUILD_DIR)
编译过程中生成的目标文件build/obj/test-mpi.o在创建可执行文件build/bin/test-mpi后被删除。
我相信make 将build/obj/test-mpi.o 视为intermediate file。但是,我期望 build/obj/test-mpi.o 不会被视为中间文件,因为它明确出现在目标 $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c 中,并且 gnu make 文档指出“通常,如果文件在 makefile 中作为目标或先决条件”。
这种行为has been reported 在类似的问题中,但我相信在这两种情况下,文件不应被视为中间文件,因为它们出现在目标中。我错过了什么吗?
【问题讨论】:
-
build/obj/test-mpi.o是如何显式出现在$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c中的? -
问题是,你为什么关心目标文件消失了?
-
我想维护目标文件以避免不必要的重新编译。在这种情况下,可执行文件依赖于单个目标文件,但如果以后的可执行文件依赖于多个目标文件,我想只重新编译有变化的目标文件。
-
如果可执行文件依赖于多个目标文件,那么您必须在生成文件中编写一个规则来列出所有这些文件。一旦编写了这样的规则,目标文件将不再被视为中间文件。
标签: makefile