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

调用Fortran共享库子程序时出现链接错误的解决方法

解决Fortran共享库链接错误:undefined reference to `my_subroutine_'

问题原因

当子程序定义在Fortran模块内时,gfortran会对符号名进行修饰(name mangling),生成带有模块前缀的符号(比如__my_module_MOD_my_subroutine)。而测试程序中用external :: my_subroutine声明时,编译器会去寻找全局的my_subroutine_符号,两者不匹配,导致链接失败。

解决方案

方案1:在测试程序中引用模块(推荐)

直接在测试程序中使用定义子程序的模块,编译器会自动识别模块内的子程序符号,无需手动声明external。修改test_program.f90:

! test_program.f90

program main
    implicit none
    use my_module  ! 引入模块,自动获取子程序接口
    call my_subroutine()
end program main

保持原编译命令不变:

gfortran test_program.f90 -o test_program -L. -lmy_library

这种方式符合现代Fortran编程规范,能获得类型检查、接口自动生成等好处,避免潜在的错误。

方案2:强制子程序使用C风格符号(不推荐)

如果必须使用external声明,可以通过bind(C)属性让子程序的符号名不被模块修饰,保持全局可见。修改my_module.f90:

! my_module.f90

module my_module
    contains

    ! 使用bind(C)指定符号名,避免模块修饰
    subroutine my_subroutine() bind(C, name='my_subroutine')
        print *, "Hello from my_subroutine!"
    end subroutine my_subroutine

end module my_module

重新编译共享库:

gfortran -shared -fPIC my_module.f90 -o libmy_library.so

此时测试程序的external声明就能找到对应的my_subroutine符号(gfortran会自动添加下划线,匹配my_subroutine_)。

注意事项

  • 优先选择方案1,模块是Fortran中管理代码和接口的标准方式,能提升代码的可维护性和安全性。
  • 方案2仅适用于特殊场景,会破坏模块的封装性,且可能引发符号冲突。

内容的提问来源于stack exchange,提问作者Sara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:37:24