gmake 编译和 link 不同目录下的源文件

gmake compile and link source files in different directories

我正在尝试在 windows 机器上使用 gfortran 和 GNU Make 3.81 编译和 link 不同文件夹中的几个文件。我从这个参考中学习了如何使用通配符:

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.

非常感谢任何帮助!

要使用 SRCS_C 完成您想要的操作,请考虑使用:

SRCS_C =\
$(wildcard solvers/*.f90) \
$(wildcard user/*.f90) \
$(wildcard *.f90) $(TARGET).f90

另请注意,(TARGET).f90 也将与 $(wildcard *.f90) 匹配,在您的情况下会导致 test.f90SRCS_C 中包含两次。在此示例中,您可以安全地省略 $(TARGET).f90