2017-03-26 7 views
0

Ich habe zwei Quelldateien, library.f90 und toolbox.f90 in einem separaten Verzeichnis. Diese werden in Objektdateien kompiliert, die beim Kompilieren der Hauptdatei mit dem passenden Namen main verknüpft werden. Am Anfang hatte ich dieses Makefile:Warum werden diese Objektdateien nicht neu kompiliert, wenn die Quelldateien geändert werden?

TARGET = main 
SRC  = ${TARGET}.f95 

FC  = /usr/bin/gfortran 
CFLAGS = -O2 -std=gnu -Wfatal-errors -I${INCLUDE} 

INCLUDE = /home/ma/include 
OBJ  = library.o toolbox.o 
OBJ_SRC = $(subst .o,.f90,${OBJ}) 


all: ${TARGET} 

${TARGET}: ${SRC} ${OBJ} 
    @${FC} ${CFLAGS} -pedantic -Wall ${OBJ} ${SRC} -o ${TARGET} 

${OBJ}: 
    @echo "Compiling $(subst .o,,[email protected])" 
    @${FC} ${CFLAGS} -c ${INCLUDE}/$(subst .o,.f90,[email protected]) -o [email protected] 

clean: 
    @rm -vf ${TARGET} ${OBJ} 

aber nicht library.o nicht neu kompilieren (oder toolbox.o, respectively), wenn die Quelldatei library.f90 oder toolbox.f90 bearbeitet wird. Ich dachte, dies war, weil die Abhängigkeit fehlte, so gezwickt ich das Makefile wie folgt aussehen:

TARGET = main 
SRC  = ${TARGET}.f95 

FC  = /usr/bin/gfortran 
CFLAGS = -O2 -std=gnu -Wfatal-errors -I${INCLUDE} 

INCLUDE = /home/ma/include 
OBJ  = library.o toolbox.o 

all: ${TARGET} 

${TARGET}: ${SRC} ${OBJ} 
    @${FC} ${CFLAGS} -pedantic -Wall ${OBJ} ${SRC} -o ${TARGET} 

${OBJ}: ${OBJ_SRC} 
    @echo "Compiling $(subst .o,,[email protected])" 
    @${FC} ${CFLAGS} -c ${INCLUDE}/$(subst .o,.f90,[email protected]) -o [email protected] 

clean: 
    @rm -vf ${TARGET} ${OBJ} 

Das aber führt den Fehler

make: *** No rule to make target 'library.f90', needed by 'library.o'. Stop. 

ich das nicht verstehen, weil es ist keine Regel, um ${SRC} entweder zu erstellen, aber make erkennt die Abhängigkeit dort und kompiliert die Quelldatei wie erwartet.

Antwort

2

In Ihrer ersten Version wurde in der Regel der Objektdateien keine Voraussetzung angegeben. Deshalb hat make nicht überprüft, ob library.f90 sich geändert hat, und hat es daher nicht neu erstellt.

Ihre zweite Version ist etwas besser, aber es bedeutet jetzt, dass sowohl library.o und toolbox.o auf hängen sowohllibrary.f90 und toolbox.f90, was bedeutet, dass, wenn entweder ein geändert wird, werden beide wieder aufzubauen, und wenn eines fehlt, ist, beide baut wird versagen.

Warum für Ihre Regel fehlgeschlagen: Es suchte nach library.f90 in Ihrem aktuellen Verzeichnis, aber aus der Regel folgere ich, dass die Quellen im Unterverzeichnis /home/ma/include sind.

Eine bessere Lösung wäre dies:

${OBJ} : %.o : ${INCLUDE}/%.f90 
     ${FC} ${CFLAGS} -c $^ -o [email protected] 

(. Ich entfernte auch die führenden @, wie ich es sehr nützlich finde den tatsächlichen Befehl zu sehen, um es auszuführen versucht)

Verwandte Themen