使用存档库编译 fortran 程序会导致未定义的引用状态

问题描述 投票:0回答:1

我制作了一个小型图书馆并将其存档。我试图在编译程序时使用该存档,但最终得到了未定义的引用状态。

这是一个例子。

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

尝试编译

main.f90

$ 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

这是存档、

main.f90
的编译(和/或链接)和/或其他问题吗?

fortran static-libraries gfortran archive
1个回答
0
投票

链接器执行一次传递并从左到右处理参数。如果该行显示为

gfortran -L. -lmymod main.o

链接器首先查看 mymod,发现没有什么需要解析,然后转到 main.o。当它到达 main.o 时,它需要 mymod,因此它会查找下一个参数,但找不到任何参数,则返回错误。如果链接线改为

gfortran main.o -L. -lmymod

这将解决问题。对于库,链接器只获取它需要的内容。根据档案的构建方式,多次拥有相同的库并非闻所未闻。

抱歉,我无法显示示例 - Stack Overflow 语法检查器不断将该行标记为错误,并且不允许我将其作为答案提交

© www.soinside.com 2019 - 2024. All rights reserved.