如何在Makefile中定义规则以仅编译已修改的*.cpp文件(及其依赖项),而不是编译所有的*.cpp文件

如何在Makefile中定义规则以仅编译已修改的*.cpp文件(及其依赖项),而不是编译所有的*.cpp文件,makefile,gnu-make,Makefile,Gnu Make,假设我有文件: Libs: 1.cpp,1.h 2.cpp,2.h 3.cpp,3.h 节目: program.cpp 有没有办法创建Makefile,只编译上次编译时修改的*.cpp 目前我有这样的想法: SRCS = one.cpp two.cpp three.cpp OBJS = $(SRCS:.cpp=.o) all: $(OBJS) program .cpp.o: g++ -Wall -c $< program: g++ -Wall $(OBJS)

假设我有文件:

Libs:

  • 1.cpp,1.h
  • 2.cpp,2.h
  • 3.cpp,3.h
节目:

  • program.cpp
有没有办法创建Makefile,只编译上次编译时修改的*.cpp

目前我有这样的想法:

SRCS = one.cpp two.cpp three.cpp
OBJS = $(SRCS:.cpp=.o)

all: $(OBJS) program

.cpp.o:
    g++ -Wall -c $<

program:
    g++ -Wall $(OBJS) program.cpp -o program

clean:
    rm -f $(OBJS) program
我希望以这种方式更改Makefile,它将识别我的更改并重新编译该文件及其依赖项(如果one.cpp使用two.cpp中已修改的代码,则应重新编译这两个文件)

因此,如果我修改two.cpp,make应该执行以下操作:

g++ -Wall -c two.cpp
g++ -Wall $(OBJS) program.cpp -o program
但是,如果one.cpp使用修改过的two.cpp中的代码,则应执行以下操作:

g++ -Wall -c one.cpp
g++ -Wall -c two.cpp
g++ -Wall $(OBJS) program.cpp -o program

将命令运行所依赖的文件添加到目标名称的右侧

例如:

default: hello.c
   gcc -o hello.bin hello.c

install: hello.bin
   cp hello.bin ../

您只需告诉
make
该.o文件依赖于.cpp文件:

%.cpp.o: %.cpp
    g++ -Wall -c -o $@ $<
%.cpp.o:%.cpp
g++-Wall-c-o$@$<

首先,我们将对象文件作为可执行文件的先决条件。一旦完成此操作,Make将在其中一个SRC发生更改时重建
程序
,因此我们不需要将
OBJS
作为明确的目标:

all: program

program: $(OBJS)
  g++ -Wall $(OBJS) program.cpp -o program
然后,我们将头文件作为对象的先决条件,这样,如果我们更改了three.h,make将重建three.o:

$(OBJS): %.o : %.h
最后,由于one.cpp通过two.h(我希望)使用two.cpp中的代码,我们将two.h作为one.o的先决条件:

one.o: two.h
为了使事情更干净、更易于维护,我们使用了自动变量:

program: $(OBJS)
  g++ -Wall $^ program.cpp -o $@
把所有这些放在一起,我们得到:

SRCS=one.cpp two.cpp three.cpp
OBJS=$(SRCS:.cpp=.o)
全部:程序
$(OBJS):%.o:%.h
o:2.h
.cpp.o:
g++-Wall-c$<
程序:$(OBJS)
g++-Wall$^program.cpp-o$@
清洁:
rm-f$(OBJS)计划

我们还可以做一些事情(比如将program.o添加到
OBJS
),但这就足够了。

这不是
$(OBJS)
的目的吗?你告诉我,这是你的代码。我从来没有在依赖项字段中使用过变量,但从逻辑上讲,没有什么可以阻止它工作。变量可以是先决条件,但除了
$(OBJS)
(我想你的意思是
one.cpp
,而不是
first.cpp
)之外,OP的makefile中还应该预先要求其他东西这不能解决头文件或对象文件的依赖性问题。^^^^这对我不起作用。您的解决方案没有%.h目标的规则。不知道为什么会被接受。
program: $(OBJS)
  g++ -Wall $^ program.cpp -o $@
SRCS = one.cpp two.cpp three.cpp
OBJS = $(SRCS:.cpp=.o)

all: program

$(OBJS): %.o : %.h

one.o: two.h

.cpp.o:
  g++ -Wall -c $<

program: $(OBJS)
  g++ -Wall $^ program.cpp -o $@

clean:
  rm -f $(OBJS) program