含.o目标文件与.so共享库的Fortran Makefile无法生成可执行文件的问题排查
Fortran Makefile 无法生成可执行文件问题排查
问题详情
作为Makefile新手,我尝试编写包含.o目标文件与.so共享库的Fortran Makefile。此前通过终端命令:
gfortran -ffree-line-length-none -o binary A.F90 B.F90 C.F90 /Path/to/Directory/D.so
可成功生成可执行文件binary,但自行编写的Makefile仅生成了A.o、B.o、C.o文件,未生成binary;再次执行make时提示make: Nothing to be done for 'OBJ1'.。
附上编写的Makefile内容:
FORTRAN_COMPILER=gfortran #FORTRAN_FLAGS=-O3 -Wall -Wextra -std=f2008 -ffree-line-length-none FORTRAN_FLAGS=-ffree-line-length-none SRC=A.F90 B.F90 C.F90 OBJ1:${SRC:.F90=.o} SharedLib_PATH = /Path/to/Directory OBJ2 = $(SharedLib_PATH)/D.so LIBS = $(OBJ1) $(OBJ2) %.o: %.F90 @echo 'converting .F90 files to .o' $(FORTRAN_COMPILER) $(FORTRAN_FLAGS) -o $@ -c $< binary: $(LIBS) @echo 'make an executable from objet files (.o) and the shared object (.so)' $(FORTRAN_COMPILER) $(FORTRAN_FLAGS) -o $@ $(LIBS) clean: @echo 'clean' @rm -f *.mod *.o binary
执行Makefile后的输出:
converting .F90 files to .o gfortran -ffree-line-length-none -o A.o -c A.F90 converting .F90 files to .o gfortran -ffree-line-length-none -o B.o -c B.F90 converting .F90 files to .o gfortran -ffree-line-length-none -o C.o -c C.F90
问题原因
- 默认目标错误:Make默认执行Makefile中的第一个目标,这里第一个目标是
OBJ1——一个没有实际生成命令的伪目标,仅负责触发.o文件的生成。因此Make完成.o文件生成后就停止,不会自动执行binary目标。 OBJ1定义错误:原本想让OBJ1存储所有.o文件列表,却写成了目标规则OBJ1:${SRC:.F90=.o},导致$(OBJ1)展开为空,LIBS变量内容失效,binary目标的依赖不完整。
修复后的Makefile
FORTRAN_COMPILER=gfortran #FORTRAN_FLAGS=-O3 -Wall -Wextra -std=f2008 -ffree-line-length-none FORTRAN_FLAGS=-ffree-line-length-none SRC=A.F90 B.F90 C.F90 # 将OBJ1改为变量,存储所有.o文件列表 OBJ1 = ${SRC:.F90=.o} SharedLib_PATH = /Path/to/Directory OBJ2 = $(SharedLib_PATH)/D.so LIBS = $(OBJ1) $(OBJ2) # 指定默认目标为binary,确保make默认执行该目标 .DEFAULT_GOAL := binary %.o: %.F90 @echo 'converting .F90 files to .o' $(FORTRAN_COMPILER) $(FORTRAN_FLAGS) -o $@ -c $< binary: $(LIBS) @echo 'make an executable from object files (.o) and the shared object (.so)' $(FORTRAN_COMPILER) $(FORTRAN_FLAGS) -o $@ $(LIBS) clean: @echo 'clean' @rm -f *.mod *.o binary
关键修改说明
- 把
OBJ1:${SRC:.F90=.o}改为变量定义OBJ1 = ${SRC:.F90=.o},让$(OBJ1)能正确展开为A.o B.o C.o。 - 添加
.DEFAULT_GOAL := binary,指定Make默认执行的目标为binary,执行make时会自动生成可执行文件。 - 修正
binary目标中的拼写错误:将objet改为object。
内容的提问来源于stack exchange,提问作者user790082
相关产品推荐
相关产品推荐

