我正在尝试为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包含在module_1中,module_2也包含在module_1中。在这种情况下,我只需要将main.f90和module _ * .f90包含在我的Makefile中(如果没有错)。我还有一个静态库供你使用。
# 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
我从制作过程中得到了很多错误,但我想它们都来自同一个地方。
$ 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.
除错误外,我还有几个问题:
如何选择合适的标志进行编译?
由于module_1在module_1中使用,我是否需要按顺序编译它们?实际上我有很多模块,所以我认为我无法逐一指定......
我什么时候需要创建依赖.d文件?我不太清楚它是如何工作的。
我是否需要从.o编译.mod?例如,添加一条线 %.mod:%。o
非常感谢。