没有规则来制作目标,但文件存在,编译

时间:2014-12-06 16:39:05

标签: makefile gfortran

我似乎无法调试此问题,有人可以帮忙吗? * .f90文件确实存在且目录正确。我不确定它是什么,gfortran编译器在makefile之外工作正常。

make[1]: Entering directory '/media/f/fv/ED-2.1/ED/build/bin'
    make[1]: *** No rule to make target 'media/f/fv/ED-2.1/ED/src/utils/allometry.f90', needed by 'allometry.o'.  Stop.
    make[1]: Leaving directory '/media/f/fv/ED-2.1/ED/build/bin'
    Makefile:24: recipe for target 'all' failed


This is the makefile

#----- Define path and compilation --------------------------------------------------------#
include paths.mk
include include.mk.$(OPT)
#----- Compiler commands. -----------------------------------------------------------------#
INCLUDES    = $(PAR_INCS) -I$(ED_INCS) $(HDF5_INCS) $(MPI_INCS) 
F90_COMMAND = $(F_COMP) -c $(F_OPTS) $(INCLUDES) $(PAR_DEFS)
FPP_COMMAND = $(F_COMP) -c -DUSE_INTERF=$(USE_INTERF) -DUSENC=$(USENC) -D$(CMACH)          \
              -DUSE_HDF5=$(USE_HDF5) -DUSE_COLLECTIVE_MPIO=$(USE_COLLECTIVE_MPIO)          \
              -DUSE_MPIWTIME=$(USE_MPIWTIME) $(F_OPTS) $(INCLUDES) $(PAR_DEFS)
CXX_COMMAND = $(C_COMP) -c $(C_OPTS) -D$(CMACH) $(HDF5_INCS) $(INCLUDES) $(PAR_DEFS)
#----- Define archive and executable names. -----------------------------------------------#
EXE=$(BASE)/ed_$(ED_VERSION)-$(OPT)
LIBMODEL=$(BASE)/ed_$(ED_VERSION)-$(OPT).a

include objects.mk
#----- Define targets. --------------------------------------------------------------------#

all:
    make gendep
    #$(info $$EXE is [${EXE}])
    make $(EXE)
    make $(EXE)
    make $(EXE)
    make $(EXE)
    make $(EXE)

gendep:
    @echo ""
    ./generate_deps.sh $(ED_ROOT)
    @echo === Finished dependencies ===

$(EXE): $(LIBMODEL) $(MAINOBJ) 
    @echo ""
    $(LOADER) -o $(EXE) edmain.o $(LOADER_OPTS) $(LIBMODEL) $(HDF5_LIBS) $(PAR_LIBS)   \
    $(NC_LIBS) $(LIBS) $(LOADER_OPTS)
    @echo ""
    @echo Finished building === $(EXE)
    @echo ""

$(MAINOBJ):  $(MAIN) 
    @echo ""
    cp -f $< $(<F:.f90=.f90)
    $(F90_COMMAND) $(<F:.f90=.f90)
    rm -f $(<F:.f90=.f90) 

$(LIBMODEL): $(OBJ_MODEL)
    $(ARCHIVE) $(LIBMODEL) $(OBJ_MODEL)

FORCE: 

install:
    @echo ""
    ln -fs `pwd`/$(EXE) ../run/$(BASE)
    ln -fs `pwd`/$(EXE) ../test/$(BASE)
    @echo ""

clean:
    @echo ""
    rm -f $(LIBMODEL) $(EXE) *.o *.mod *.F90 *.f90 *.stb *.d dependency.mk 
    rm -f ../$(EXE) ../$(LIBMODEL)
    touch dependency.mk
    @echo ""

#----- Define rules -----------------------------------------------------------------------#
include rules.mk

1 个答案:

答案 0 :(得分:1)

这个makefile很乱。为什么在make $(EXE)配方中连续5次列出相同的命令all?为什么使用$(<F:.f90=.f90)只是用相同的字符串.f90替换字符串.f90,基本上是无操作?

此外,我们在此处没有足够的信息来回答您的问题:您尚未提供变量MAINOBJOBJ_MODEL的定义,或者更重要的是,{{ 1}}。至少有一个是错的。除非您错误地转录了错误消息(请务必剪切并粘贴实际错误,请不要尝试手动输入!!),然后执行以下操作:

MAIN

告诉你问题是什么;请注意,在make[1]: *** No rule to make target 'media/f/fv/ED-2.1/ED/src/utils/allometry.f90', needed by 'allometry.o'. Stop. 之前,此路径名的开头没有斜杠(/)。所以这不是一条绝对的道路,它是一条相对的道路。这意味着make实际上是在尝试查找名为media的文件,该文件显然不会存在。

我们无法告诉您为什么会发生这种情况,因为您还没有提供有关如何设置这些变量的信息。很可能坏的是/media/f/fv/ED-2.1/ED/build/bin/media/f/fv/ED-2.1/ED/src/utils/allometry.f90,但很难确定。