So definieren Sie Regeln im Makefile, um nur die * .cpp-Dateien zu kompilieren, die geändert wurden (und ihre Abhängigkeiten), nicht alle * .cpp-Dateien

Sagen wir, ich habe Dateien:

Libs:

one.cpp, one.h two.cpp, two.h three.cpp, three.h

Programm

program.cpp

Ist es möglich, ein Makefile zu erstellen, das nur die * .cpp kompiliert, die seit der letzten Kompilierung geändert wurden?

Derzeit habe ich so etwas:

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

all: $(OBJS) program

.cpp.o:
    g++ -Wall -c 
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
lt; program: g++ -Wall $(OBJS) program.cpp -o program clean: rm -f $(OBJS) program

Ich arbeite gut, aber wenn ich mein Programm kompiliere und dann two.cpp oder two.h ändere, muss ich zuerst "make clean" ausführen, denn wenn ich zweitens "make" ausführe, erhalte ich:

Nothing to be done for 'all'.

Ich möchte mein Makefile auf diese Weise ändern, es würde meine Änderungen erkennen und diese Datei und ihre Abhängigkeiten neu kompilieren (wenn one.cpp Code aus two.cpp verwendet, der geändert wurde, sollten beide Dateien neu kompiliert werden).

So wenn ich two.cpp ändere, sollte make tun:

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

Aber wenn one.cpp Code aus two.cpp verwendet, der geändert wurde, muss shold do:

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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage