Makefile编译所有文件,而不是最后编辑的文件



请注意,在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)。

如何解决这个问题?

注意:我需要prog, bin/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是所有目标文件的先决条件,它们都将被重新编译。

你需要的是使用一个静态模式规则:

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

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

最新更新