Fortran Makefile错误和问题

Fortran Makefile错误和问题,makefile,fortran,Makefile,Fortran,我正在尝试为Fortran代码创建自己的Makefile。它与另一个Makefile非常相似,可以完美地工作。但不幸的是,我无法自己找出问题所在。配置描述如下: 我有一个主文件夹,其中包含子文件夹src、lib、results、mod、obj。Makefile本身也在主文件夹中。我在src文件夹中有几个fortran源文件,比如main.f90、subroutine_1.f90、subroutine_2.f90、module_1.f90和module_2.f90。子例程_1和子例程_2包含在模块

我正在尝试为Fortran代码创建自己的Makefile。它与另一个Makefile非常相似,可以完美地工作。但不幸的是,我无法自己找出问题所在。配置描述如下:

我有一个主文件夹,其中包含子文件夹src、lib、results、mod、obj。Makefile本身也在主文件夹中。我在src文件夹中有几个fortran源文件,比如main.f90、subroutine_1.f90、subroutine_2.f90、module_1.f90和module_2.f90。子例程_1和子例程_2包含在模块_1中,模块_2也用于模块_1中。在这种情况下,我只需要在Makefile中包含main.f90和module*.f90(如果没有错的话)。我还有一个静态库要使用

# For WINDOWS
RM          :=  del
PS          :=  $(strip \)

#--------------------- DICTIONARY ---------------------
BUILD_DIR   :=  .       
SRC_DIR     :=  $(BUILD_DIR)$(PS)src
LIB_DIR     :=  -L$(BUILD_DIR)$(PS)lib
TAR_DIR     :=  $(BUILD_DIR)$(PS)results
MOD_DIR     :=  $(BUILD_DIR)$(PS)mod
OBJ_DIR     :=  $(BUILD_DIR)$(PS)obj

#------------------ COMPILER AND FLAG ------------------
FC          :=  gfortran
FCFLAGS     := -g -c -fbacktrace -fno-align-commons -fbounds-check\
                -J"$(MOD_DIR)"
FLFLAGS     :=

#------------------- TARGET & SOURCE--------------------
TARGET      :=  $(TAR_DIR)$(PS)main.exe
SRC         :=  $(notdir $(wildcard $(SRC_DIR)$(PS)module_*.f90))\
                main.f90
LIB         :=  -lfftw3-3.lib
LDFLAGS     :=  $(LIB_DIR)   
OBJ         :=  $(patsubst %.f90, $(OBJ_DIR)$(PS)%.o, $(notdir $(SRC)))

all:    $(TARGET)
# Final linking
$(TARGET):  $(OBJ)
    $(FC) $(FLFLAGS) -o $@ $(OBJ) $(LDFLAGS) $(LIB)   #line a

$(OBJ_DIR)$(PS)%.o: $(SRC_DIR)$(PS)%.f90
    $(FC) $(FCFLAGS) -o $@ $<                         #line b

clean:   
    -$(RM) -f $(OBJ_DIR)$(PS)*.o
    -$(RM) -f $(MOD_DIR)$(PS)*.mod
用于WINDOWS的
#
RM:=del
PS:=$(条带\)
#---------------------字典---------------------
生成目录:=。
SRC_DIR:=$(构建目录)$(PS)SRC
LIB_DIR:=-L$(BUILD_DIR)$(PS)LIB
TAR_DIR:=$(构建目录)$(PS)结果
MOD_DIR:=$(BUILD_DIR)$(PS)MOD
对象目录:=$(构建目录)$(PS)对象目录
#------------------编译器和标志------------------
FC:=gfortran
FCFLAGS:=-g-c-fbacktrace-fno align COMMON-fbounds check\
-J“$(MOD_DIR)”
FLFLAGS:=
#-------------------目标与来源--------------------
目标:=$(TAR_DIR)$(PS)main.exe
SRC:=$(notdir$(通配符$(SRC_DIR)$(PS)模块*.f90))\
main.f90
LIB:=-lfftw3-3.LIB
LDFLAGS:=$(库目录)
OBJ:=$(patsubst%.f90,$(OBJ_DIR)$(PS)%.o,$(notdir$(SRC)))
全部:$(目标)
#最终链接
$(目标):$(OBJ)
$(FC)$(FLFLAGS)-o$@$(OBJ)$(LDFLAGS)$(LIB)#行a
$(OBJ_DIR)$(PS)%.o:$(SRC_DIR)$(PS)%.f90
$(FC)$(FCFLAGS)-o$@$<#行b
清洁:
-$(RM)-f$(OBJ_DIR)$(PS)*.o
-$(RM)-f$(MOD_DIR)$(PS)*.MOD
我在制作过程中犯了很多错误,但我想它们都来自同一个地方

$ make
Makefile:line a: warning: overriding recipe for target '.'
Makefile:line b: warning: ignoring old recipe for target '.'
make: Circular . <- . dependency dropped.
make: *** No rule to make target 'src\%.f90', needed by '.'.  Stop.
$make
Makefile:行a:警告:覆盖目标“”的配方
Makefile:第b行:警告:忽略目标“”的旧配方

制造:圆形。在
BUILD\u DIR:=”中有多个空格字符在句点之后,去掉它们。标志取决于您想要什么。如果进行调试,
-g
-fbacktrace
-fcheck界限
都很有用。我通常也使用
-Wall
-fcheck=all
。如果您想让代码运行得更快,可能需要使用优化,例如
-03
,并去掉调试标志。此外,看起来您有一个循环依赖项,这不好。你应该尽量避免这样的事情。回答您的问题-是的,您确实需要按顺序编译它们。看看这是否解决了de问题。@b-fg谢谢。你能解释一下为什么我有循环依赖关系吗?我不太明白,检查一下。基本上你有一个模块a,它调用模块B,还有一个模块B,它同时调用模块a。你应该避免这种做法。