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.f90
在 SRCS_C
中包含两次。在此示例中,您可以安全地省略 $(TARGET).f90
。
我正在尝试在 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.f90
在 SRCS_C
中包含两次。在此示例中,您可以安全地省略 $(TARGET).f90
。