一个简单的Makefile有一个奇怪的行为......它正在杀了我。 总结一下:
_“make”产生错误
_“make -n”+手工执行(-n显示make执行的命令,然后在终端上一个接一个地执行每个命令)
_“make -d”有效(-d只显示调试信息!)
我尝试使用一些模块编译Fortran代码
这是我的makefile(只有七个.f90源文件):
F90 = gfortran # Fortran Compiler
FLAGS= # Compiler flags
LDFLAGS = #Linker flags
OBJ_DIR_NAME := obj
SRC_DIR_NAME := src
BIN_DIR_NAME := bin
PWD := $(shell pwd)
OBJ_DIR := $(PWD)/$(OBJ_DIR_NAME)
SRC_DIR := $(PWD)/$(SRC_DIR_NAME)
BIN_DIR := $(PWD)/$(BIN_DIR_NAME)
# List of source files
SRC := $(wildcard $(SRC_DIR)/*.f90)
# List of object files :
NAME := $(basename $(notdir $(SRC)))
OBJ := $(addprefix $(OBJ_DIR)/, $(addsuffix .o, $(NAME)))
# To make the executable
all: make_directory $(OBJ)
$(F90) -o $(BIN_DIR)/$(EXEC) $(OBJ) $(LDFLAGS)
# Rule to make directories
make_directory: dirobj bin
# Create all .o and .mod from the .f90 found
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.f90
$(F90) -J$(OBJ_DIR) -I$(OBJ_DIR) -c $< -o $@ $(FLAGS)
.PHONY: dirobj bin
# Create the directory $(OBJ_DIR) if needed :
ifeq ($(strip $( $(wildcard $(OBJ_DIR)) ) ), )
dirobj:
mkdir -p $(OBJ_DIR)
else
dirobj:
endif
# Create the directory $(BIN_DIR) if needed :
ifeq ($(strip $( $(wildcard $(BIN_DIR)) ) ), )
bin:
mkdir -p $(BIN_DIR)
else
bin:
endif
.PHONY: clean purge
# Clean remove all .o and .mod
clean:
rm -rf $(OBJ_DIR)
# Clean + remove executable
purge: clean
rm -rf $(BIN_DIR) $(OBJ_DIR) OUTPUT_FILES
这些是“make”所做的命令:
gfortran -J./obj -I./obj -c src/define_derivative_matrix.f90 -o obj/define_derivative_matrix.o
gfortran -J./obj -I./obj -c src/gaussm3.f90 -o obj/gaussm3.o
gfortran -J./obj -I./obj -c src/gll_library.f90 -o obj/gll_library.o
gfortran -J./obj -I./obj -c src/lagrange_poly.f90 -o obj/lagrange_poly.o
gfortran -J./obj -I./obj -c src/modules.f90 -o obj/modules.o
gfortran -J./obj -I./obj -c src/source_time_function.f90 -o obj/source_time_function.o
gfortran -J./obj -I./obj -c src/specfem1d.f90 -o obj/specfem1d.o
gfortran -o bin/xspecfem1d obj/*.o
它会产生以下错误消息:
use grid
1
Fatal Error: Can't open module file 'grid.mod' for reading at (1): No such file or directory
错误消息来自:
gfortran -J./obj -I./obj -c src/specfem1d.f90 -o obj/specfem1d.o
这需要obj / grid.mod创建:
gfortran -J./obj -I./obj -c src/modules.f90 -o obj/modules.o
但是这个文件已经正确创建了! (它位于obj /“make”的末尾) 如果我手动一个接一个地运行每个命令,一切都很完美!甚至“make -d”也有效......但不是“make”......
你见过这样的问题吗?就好像make不会等待前面命令的结束来执行其他命令。谢谢你的帮助!干杯
编辑:我通过在
之前添加一个小“睡眠”来解决这个问题gfortran -J./obj -I./obj -c src/modules.f90 -o obj/modules.o
但我不应该在一个完美的世界中这样做......