Wie spezifiziere ich die Makefile-Zielerstellungsreihenfolge ohne physische Abhängigkeiten?

Ich habe an einem C ++ - Projekt gearbeitet, das auf eine .so-Datei (dynamische Bibliothek) verweist. Nehmen wir an, ich habe ein Ziel-PROG, das mit a.so verknüpft werden muss, und a.so wird ebenfalls von mir erstellt, wie im folgenden Makefile angegeben.

<code>PROG_SRCS = prog.cpp
PROG_OBJS = $(PROG_SRCS: %.cpp:%.o)

all: PROG
PROG: $(PROG_OBJS) liba.so
    $(LINK.cpp) -o $@ $(PROG_OBJS) -la

LIBA_SRCS = liba/a.cpp
LIBA_OBJS = $(LIBA_SRCS: %.cpp:%.o)

liba.so: $(LIBA_OBJS)
    $(LINK.cpp) -shared -Wl.-soname,$@ -o $@ $^
</code>

Ich habe die automatische Generierung von Abhängigkeiten verwendet, um zu erreichen, dass die CPP-Dateien ihre eigene Abhängigkeit von den H-Dateien haben. Und prog.cpp enthält a.h.

Aber auf diese Weise, wenn ich a.cpp ändere, wäre liba.so remake, dann wäre PROG remake (relink), was ich nicht will. Ich ändere nur die Implementierung von liba.so, aber keine Schnittstellendefinitionen. PROG sollte erst neu machen, nachdem ich a.h.

Ich möchte festlegen, dass a.so erstellt werden soll, bevor PROG erstellt wird, aber die Änderungen von a.so würden nicht zur Erstellung von PROG führen.

Das folgende Makefile ist die Methode, die ich herausgefunden habe, aber mit einem leichten Nebeneffekt (erzeugen Sie eine temporäre Datei).

<code>ORDER = /tmp/.ORDER

all: PROG
PROG: $(PROG_OBJS) $(ORDER)
    $(LINK.cpp) -shared -Wl,-soname,$@ -o $@ $(PROG_OBJS) -la

$(ORDER): liba.so
    test -e $@ || touch $@
</code>

Auf diese Weise erhält $ (ORDER) jedes Mal, wenn liba.so ein Remake erhält, auch ein Remake. Die Datei wird jedoch nur berührt, wenn sie nicht vorhanden ist.

Gibt es eine Möglichkeit, diese Art von Abhängigkeit ohne Nebenwirkungen anzugeben, z. Erstellen einer tmp-Datei.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage