gpt4 book ai didi

c++ - makefile 编译所有文件而不是最后编辑的文件

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:42 25 4
gpt4 key购买 nike

请注意,SO 上也有类似的问题,但我认为我的情况有所不同,而且我的 Makefile 非常简单明了。我是 Makefile 的新手。

假设我需要编译一个项目,看起来像这样 --

.
├── [4.0K] bin
├── [ 517] Makefile
├── [4.0K] obj
└── [4.0K] src
├── [ 117] func1.cpp
├── [ 76] func2.cpp
├── [ 137] global.h
└── [ 97] main1.cpp

我的 Makefile 看起来像这样 --

CC          := g++
CFLAGS := -g -Wall -std=c++0x
LDFLAGS := -lm

NAMES := func1.cpp func2.cpp main1.cpp
SRC := $(addprefix src/,$(NAMES))
OBJ := $(addprefix obj/,$(NAMES:.cpp=.o))
DEPS := $(OBJ:.o=.d)

.PHONY: clean all debug

all: prog

debug:
$(info $$SRC: ${SRC})
$(info $$OBJ: ${OBJ})
$(info $$DEPS: ${DEPS})

prog: bin/prog

bin/prog: $(OBJ)
$(CC) $^ -o $@

$(OBJ): $(SRC)
$(CC) $(CFLAGS) -I/src/global.h -c $(addprefix src/,$(notdir $(@:.o=.cpp))) -o $@

-include $(DEPS)

clean:
rm -rf bin/*
rm -rf obj/*

假设我打开了一个文件 func1.cpp 并做了一些更改。当我调用 make 时,它会编译所有文件,但它应该只编译一个文件 (func1.cpp)。

我该如何解决这个问题?

注意:我需要 progbin/prog 出于不同的原因,而且我不能做像 obj 这样的食谱/%.o: src/%.c 因为我的目标可能与相同对象的子集不同。

最佳答案

当您编写如下规则时:

$(OBJ): $(SRC)
cmd

你的情况是

obj/func1.o obj/func2.o obj/main.o : src/func1.cpp src/func2.cpp src/main1.cpp
cmd

先决条件不会压缩。这会为每个目标生成一条规则,并满足所有先决条件。即:

obj/func1.o : src/func1.cpp src/func2.cpp src/main1.cpp
cmd

obj/func2.o : src/func1.cpp src/func2.cpp src/main1.cpp
cmd

obj/main.o : src/func1.cpp src/func2.cpp src/main1.cpp
cmd

由于 src/func1.cpp 是所有目标文件的先决条件,因此它们都会被重新编译。

您想要的是使用 static pattern rule :

obj/%.o : src/%.cpp
$(CC) $(CFLAGS) -I/src -c $< -o $@

请注意,-I 用于包含目录,而不是包含文件。

关于c++ - makefile 编译所有文件而不是最后编辑的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39836609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com