gmake编译和链接不同目录中的源文件

时间:2015-01-23 19:28:34

标签: makefile fortran mingw gnu-make gfortran

我试图在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.

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

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

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

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