我制作了一个小型图书馆并将其存档。我试图在编译程序时使用该存档,但最终得到了未定义的引用状态。
这是一个例子。
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
的编译(和/或链接)和/或其他问题吗?
链接器执行一次传递并从左到右处理参数。如果该行显示为
gfortran -L. -lmymod main.o
链接器首先查看 mymod,发现没有什么需要解析,然后转到 main.o。当它到达 main.o 时,它需要 mymod,因此它会查找下一个参数,但找不到任何参数,则返回错误。如果链接线改为
gfortran main.o -L. -lmymod
这将解决问题。对于库,链接器只获取它需要的内容。根据档案的构建方式,多次拥有相同的库并非闻所未闻。
抱歉,我无法显示示例 - Stack Overflow 语法检查器不断将该行标记为错误,并且不允许我将其作为答案提交