9

假设我有文件:

库:

  • 一.cpp,一.h
  • 两个.cpp,两个.h
  • 三.cpp, 三.h

程序:

  • 程序.cpp

有没有办法创建只编译从上次编译中修改的 *.cpp 的 Makefile?

目前我有这样的事情:

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

我工作得很好,但是当我编译我的程序然后更改 two.cpp 或 two.h 时,我需要先运行“make clean”,因为当我第二次运行“make”时,我得到:

Nothing to be done for 'all'.

我想以这种方式更改我的 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
4

3 回答 3

12

首先,我们使目标文件成为可执行文件的先决条件。完成此操作后,只要其中一个 SRCS 更改,Make 将重新program构建,因此我们不需要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.ha 作为 one.o 的先决条件:

one.o: two.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

我们还可以做更多的事情(比如将 program.o 添加到OBJS),但这对于今天来说已经足够了。

于 2010-06-21T19:09:10.123 回答
1

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

例子:

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

install: hello.bin
   cp hello.bin ../
于 2010-06-21T18:44:37.470 回答
0

您需要做的就是告诉make.o 文件依赖于 .cpp 文件:

%.cpp.o: %.cpp
    g++ -Wall -c -o $@ $<
于 2010-06-21T18:56:09.520 回答