我试图在Windows机器上使用gfortran和GNU Make 3.81编译和链接不同文件夹中的多个文件。我从这个参考资料中学到了如何使用通配符:
gmake compile all files in a directory
我想做一些类似于这个参考的事情:
Makefiles with source files in different directories
但不同之处在于我想在几个其他目录中的源文件中只在我的根目录中构建一个可执行文件。我试着阅读制作手册:
http://www.gnu.org/software/make/manual/make.html
但它似乎主要针对c / c ++编程和非Windows语法。
我当前的makefile如下所示:
FC = gfortran
MOD_DIR = "bin"
FCFLAGS = -O0 -Og -Wall -pedantic -fbacktrace -fcheck=all
FCFLAGS += -J$(MOD_DIR) -fopenmp -fimplicit-none -Wuninitialized
TARGET = test
SRCS_C = $(wildcard *.f90) $(TARGET).f90
OBJS_C = $(patsubst %.f90,%.o,$(SRCS_C))
all: $(TARGET)
$(TARGET): $(OBJS_C)
$(FC) -o $@ $(FCFLAGS) $(OBJS_C)
$(OBJS_C): $(SRCS_C)
$(FC) $(FCFLAGS) -c $(SRCS_C)
clean:
del *.o $(MOD_DIR)\*.mod
当我的所有源文件都在根目录中时,哪个工作正常。所以我认为这会奏效:
FC = gfortran
MOD_DIR = "bin"
FCFLAGS = -O0 -Og -Wall -pedantic -fbacktrace -fcheck=all
# FCFLAGS += -J$(MOD_DIR) -I$(INCLUDE_DIR) -fopenmp -fimplicit-none -Wuninitialized
FCFLAGS += -J$(MOD_DIR) -fopenmp -fimplicit-none -Wuninitialized
TARGET = test
SRCS_C =\
"solvers/"$(wildcard *.f90) \
"user/"$(wildcard *.f90) \
$(wildcard *.f90) $(TARGET).f90
OBJS_C = $(patsubst %.f90,%.o,$(SRCS_C))
all: $(TARGET)
$(TARGET): $(OBJS_C)
$(FC) -o $@ $(FCFLAGS) $(OBJS_C)
$(OBJS_C): $(SRCS_C)
$(FC) $(FCFLAGS) -c $(SRCS_C)
clean:
del *.o $(MOD_DIR)\*.mod
我不介意只输入可以从中获取源文件列表的文件夹的名称。我也尝试过使用-I $(INCLUDE_DIR),但这也没有用。我上面的错误是:
gmake: *** No rule to make target `"user/"gridFun.f90', needed by `"user/"gridFu
n.o'. Stop.
非常感谢任何帮助!
答案 0 :(得分:1)
要使用SRCS_C
完成您想要的操作,请考虑使用:
SRCS_C =\
$(wildcard solvers/*.f90) \
$(wildcard user/*.f90) \
$(wildcard *.f90) $(TARGET).f90
另请注意,(TARGET).f90
也会与$(wildcard *.f90)
匹配,导致test.f90
在SRCS_C
中包含两次$(TARGET).f90
。在此示例中,您可以安全地省略{{1}}。