2017-03-26 67 views
0

我有兩個源文件,library.f90toolbox.f90在一個單獨的目錄中。它們被編譯成目標文件,在編譯主文件時被鏈接,適當地稱爲main。起初,我有這個Makefile:爲什麼在源文件更改時不make重新編譯這些目標文件?

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} 

但這並不重新編譯library.o(或toolbox.o,分別)的源文件library.f90toolbox.f90編輯時。我想這是因爲依賴是失蹤,所以我調整了Makefile文件看起來像這樣:

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} 

然而,這引發錯誤

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

我不明白這一點,因爲有並不是構建${SRC}的規則,但是可以識別那裏的依賴關係並按預期編譯源文件。

回答

2

在您的第一個版本中,對象文件的規則未指定任何先決條件。這就是爲什麼make沒有檢查library.f90是否已經改變,因此沒有重新創建它。

你的第二個版本要稍微好一些,但現在意味着這兩個library.otoolbox.o取決於library.f90toolbox.f90,這意味着如果其中任何一個變化,都被重建,如果任何一個缺少,既建立將失敗。

至於爲什麼你的規則失敗:它在你的當前目錄中尋找library.f90,但是根據規則我推斷這些源在子目錄/home/ma/include中。

一個更好的解決辦法是這樣的:

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

(我還刪除了領先@,因爲我覺得它非常有用,看看它試圖運行的實際命令)

相關問題