使用自制归档库编译Fortran程序出现未定义引用错误,求排查原因
Fortran归档库链接报错:未定义引用
__mymod_MOD_f 问题复现
源代码
main.f90:
program main use mymod, only : f implicit none real :: a, b a = 5 call f(a, b) print *, b end program main
mymod.f90:
module mymod implicit none private public :: f contains subroutine f(a, b) real, intent(in) :: a real, intent(out) :: b b = sqrt(a) end subroutine f end module mymod
归档库创建步骤
$ gfortran -c mymod.f90 $ ar crv libmymod.a mymod.o a - mymod.o
编译链接命令及错误
$ gfortran -c main.f90 $ gfortran -L. -lmymod main.o /usr/bin/ld: main.o: in function `MAIN__': main.f90:(.text+0x27): undefined reference to `__mymod_MOD_f' collect2: error: ld returned 1 exit status
原因分析
这是链接顺序错误导致的。gfortran底层使用的ld链接器会按从左到右的顺序处理输入的目标文件和库:
- 当链接器先处理
libmymod.a时,此时还没有任何目标文件引用库中的符号,链接器会跳过库中的目标文件,不将其纳入最终可执行文件。 - 后续处理
main.o时,发现需要__mymod_MOD_f符号,但已经没有库可以提供该符号,因此抛出未定义引用错误。
解决方法
方法1:调整链接顺序(推荐)
将引用库的目标文件放在库参数之前,让链接器先发现符号依赖,再从库中提取对应目标文件:
gfortran main.o -L. -lmymod
方法2:一步完成编译与链接
直接用源代码编译链接,无需分开生成目标文件,gfortran会自动处理正确的依赖顺序:
gfortran main.f90 -L. -lmymod -o main
方法3:强制链接器加载库(不推荐)
通过-Wl,--no-as-needed参数强制链接器加载指定库,即使暂时没有符号依赖:
gfortran -L. -Wl,--no-as-needed -lmymod main.o
验证
执行正确的链接命令后,运行生成的可执行文件,会输出2.2360680(5的平方根),说明问题解决。
内容的提问来源于stack exchange,提问作者jared
相关产品推荐
相关产品推荐

