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

使用自制归档库编译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链接器会按从左到右的顺序处理输入的目标文件和库:

  1. 当链接器先处理libmymod.a时,此时还没有任何目标文件引用库中的符号,链接器会跳过库中的目标文件,不将其纳入最终可执行文件。
  2. 后续处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:15:05