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

Naming of symbols in Fortran shared library, intel vs gcc?

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

__test_function_MOD_read_a_file

Intel 编译共享对象的符号名称如下:

test_function_mp_read_a_file__

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

例如考虑下面的代码 test_function.f90

MODULE test_function
   CONTAINS
   SUBROUTINE read_a_file
      PRINT *,'I did a thing!'
   END SUBROUTINE
END

编译行应该类似于

gfortran -fPIC -c test_function.f90
gfortran -shared -o libtest_function.so test_function.o

两个编译器都在破坏模块中包含的子程序的名称。 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

使用 gfortran 编译时,生成的目标文件包含

gfortran -c a.f90
nm a.o
00000000 T __bar_MOD_goo
00000013 T foo

因此,您可以在库中将函数fun 引用为foo。您可能还想使用 iso_c_binding 模块定义的类型。