You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:15:46