未定义对与抽象接口匹配的模块子例程的引用

时间:2019-04-17 15:04:17

标签: fortran gfortran

我正在尝试创建一个模块,该模块的子例程将另一个子例程的名称作为参数。这是一个主程序(main.for):

    program testmod
    use action_mod

    call main

    end program testmod

这是我的模块(action_mod.for)的示例:

module action_mod

abstract interface        
subroutine sub_interface(aA, aB)
    integer aA, aB
    intent(in) aA
    intent(out) aB
end subroutine
end interface

contains

subroutine main
    procedure(sub_interface) sub2,sub1
    call action(sub1)
    call action(sub2)
end subroutine

subroutine action(sub)
    procedure(sub_interface) sub
    integer argA, argB
    argA = 10
    call sub(argA, argB)
    write(*,*) argA," > ",argB
end subroutine

subroutine sub1(i,o)
    integer i,o        
    o = 100        
    return
end subroutine sub1

subroutine sub2(i,o)
    integer i,o        
    o = 200        
    return
end subroutine sub2

end module action_mod

我用

编译代码的地方
gfortran -o main action_mod.for main.for

我收到错误

/tmp/ccdSM11U.o: In function `__action_mod_MOD_main':
action_mod.for:(.text+0x1a2): undefined reference to `sub1_'
action_mod.for:(.text+0x1b1): undefined reference to `sub2_'
collect2: error: ld returned 1 exit status

但是当我将子例程sub1(i,o)sub2(i,o)放入主程序时,一切正常。但是,这不是我想要的。

您能帮助我找到创建模块的正确方法吗?我的代码有什么问题?

1 个答案:

答案 0 :(得分:1)

您遇到的问题与this other question中的问题大致相同,因此请阅读答案以获取更多详细信息。但是,这种情况有一些额外的复杂性,值得考虑。

在子例程main中,语句

   procedure(sub_interface) sub2,sub1

说有外部个过程sub2sub1。模块sub1的模块子例程sub2action_mod不是这些外部过程。就链接的问题而言,这就像使声明character(255) strtok“隐藏”模块函数strtok一样。

您应该从子例程中删除该语句。

但是您还有其他错误要修复。模块子例程sub1sub2的接口与抽象接口sub_interface的接口不同。您需要确保sub1sub2io的伪参数的intent属性与sub_interface的伪参数匹配。