Fortran共享库中的符号命名,intel vs gcc?

Laz*_*zer 2 fortran shared-libraries gfortran

有没有办法控制共享库中符号的命名?具体来说,我一直在使用GCC进行一个项目,我们通过Python中的C-Types访问共享库.这很好用,但是最近我一直在使用建议使用英特尔编译器的系统.我可以很好地构建共享对象,但我发现与intel相比,这些符号的命名约定略有不同.特别是当我使用gcc编译时,符号名称如下所示:

__test_function_MOD_read_a_file
Run Code Online (Sandbox Code Playgroud)

英特尔编译的共享对象具有如下符号名称:

test_function_mp_read_a_file__
Run Code Online (Sandbox Code Playgroud)

有没有办法强制命名的一致性或至少在事后改变符号的名称?

例如,考虑以下代码test_function.f90

MODULE test_function
   CONTAINS
   SUBROUTINE read_a_file
      PRINT *,'I did a thing!'
   END SUBROUTINE
END
Run Code Online (Sandbox Code Playgroud)

编译行看起来应该是这样的

gfortran -fPIC -c test_function.f90
gfortran -shared -o libtest_function.so test_function.o
Run Code Online (Sandbox Code Playgroud)

eve*_*ets 6

两个编译器都在修改模块中包含的子程序的名称.Fortran标准不强制要求任何命名约定.您可以通过使用Fortran的ISO C绑定功能来防止名称损坏,以便为子程序指定特定名称.例如,

module bar
   contains
   function fun(x) bind(c, name='foo')
       real fun, x
       fun = x
   end function fun
   function goo(x)
       real goo, x
       goo = x
   end function goo
end module bar
Run Code Online (Sandbox Code Playgroud)

使用gfortran编译时,生成的对象文件包含

gfortran -c a.f90
nm a.o
00000000 T __bar_MOD_goo
00000013 T foo
Run Code Online (Sandbox Code Playgroud)

因此,您可以funfoo在库中一样引用函数.您可能还想使用iso_c_binding模块定义的类型.