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
相关产品推荐
相关产品推荐

