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

Fortran模块中子程序的动态库调用失败问题排查

Fortran模块共享库调用失败:undefined reference 问题解决

问题核心原因

当子程序被封装在Fortran模块中时,gfortran会对符号进行模块名前缀修饰(例如模块内的sayHello会被修饰为__mylibmod_MOD_sayhello)。而你的调用代码直接写call sayHello()时,编译器会按普通子程序生成sayhello_符号,两者不匹配,因此链接时出现未定义引用错误。


解决方案一:调用端引用模块(推荐,符合Fortran规范)

在调用代码中显式use目标模块,让编译器自动识别模块内子程序的正确符号修饰:

修改调用代码libCall.f90:

program libCall
    use mylibmod          ! 引用目标模块
    implicit none         ! 建议添加,避免隐式声明隐患
    call sayHello()
end program libCall

编译时需确保编译器能找到库编译时生成的.mod模块文件(mylibmod.mod),如果模块文件不在当前目录,用-I参数指定路径:

gfortran -o libCall.exe -fPIC -I.\src .\src\libCall.f90 mylib.dll

解决方案二:修改库代码,强制导出无模块前缀的符号(适合跨语言/无法引用模块场景)

如果调用端无法引用模块(例如C/C++调用),可以通过ALIAS属性指定导出的符号名,让它和调用端预期的sayhello_一致:

修改库代码myLib.F90:

module mylibmod
    implicit none

    public :: sayHello

    contains

        subroutine sayHello()
            !GCC$ ATTRIBUTES DLLEXPORT, ALIAS: 'sayhello_' :: sayHello
            print*, 'Hello Fortran!'
        end subroutine sayHello

end module mylibmod

重新编译库后,再编译调用代码即可正常链接。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:20:03