【问题标题】:Access subroutine inside a module using a linked library使用链接库访问模块内的子例程
【发布时间】:2019-08-28 15:40:22
【问题描述】:

我想在不同的 Fortran 可执行文件中使用在静态库(用 Fortran 编写)中编写的子例程。 这是我的工作示例:

subroutine my(a,b,c)
    implicit none
    real*8, intent(in)  :: a,b
    real*8, intent(out) :: c
    !
    c = a + b
    !
end subroutine

这会生成一个我用这个 main 指向的 XXX.lib 文件:

program main
    implicit none
    !
    real*8 :: var1, var2
    real*8 :: out1
    !
    var1 = 15.0
    var2 = 10.0
    call mysum(var1,var2,out1)
    !
    write(*,*) out1
    !
end program

一切正常,但是当我想在模块中定义我的子例程时出现问题,如下所示:

module mymodule
contains
    !
    subroutine mysum(a,b,c)
        implicit none
        real*8, intent(in)  :: a,b
        real*8, intent(out) :: c
        !
        c = a + b
        !
    end subroutine
end module

此时“主”编译器无法找到子例程。有没有办法让编译器“看到”模块内声明的子例程? 谢谢

【问题讨论】:

    标签: fortran static-libraries


    【解决方案1】:

    简单地说,如果您在模块中定义了一个子例程(或其他任何内容),并且您希望在其他地方可以访问,那么您需要“使用”该模块:

    program main
      use mymodule
      implicit none
      ....
    end program
    

    当您没有use mymodule 允许编译器看到子例程mysum 实际上是一个模块子例程时,编译器仍会将mysum 视为外部子例程。

    以前,mysum 是一个外部子例程,但该外部子例程是在库对象中定义的。它不再是同样的方式:可能会有各种各样的name mangling。是你的链接器在抱怨。

    【讨论】:

    • 谢谢,我认为在这种情况下不需要“使用 mymodule”,因为它在库中。这实际上解决了我的问题,谢谢!
    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2016-11-27
    相关资源
    最近更新 更多