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

Fortran共享库中的符号命名,intel vs gcc?,fortran,shared-libraries,gfortran,Fortran,Shared Libraries,Gfortran,有没有办法控制共享库中符号的命名?具体地说,我一直在为一个项目使用GCC,在这个项目中,我们通过Python中的C类型访问共享库。这非常有效,不过最近我一直在使用一个建议使用英特尔编译器的系统。我可以很好地构建共享对象,但我发现符号的命名约定与intel略有不同。特别是当我使用gcc编译时,符号名称如下所示: __test_function_MOD_read_a_file 英特尔编译共享对象的符号名称如下: test_function_mp_read_a_file__ 有没有办法强制命名的一

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

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

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

例如,考虑下面的代码测试函数: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
模块定义的类型。

您的问题实际上与共享库无关,而与Fortran有关。“我如何才能使
gfortran
和英特尔
ifort
具有一致的外部函数名称?”这是我将如何表达的。mod文件及其符号损坏在不同的编译器之间完全不兼容,即使在同一编译器的主要版本之间也是如此。当然,如果您声明诸如real(C_FLOAT)bind之类的变量(C,名称=…)x您可以完全控制兼容C编译器看到的符号名称。需要模块的子例程和函数的代码很容易在编译器之间完全不兼容。例如,GCC和Intel的数组描述符不同。当在这两者之间使用时,此类代码将崩溃。如果您希望使用数组描述符在这种情况下,如果您的编译器实现了新的F2008功能,只要Fortran编译器与相同的C编译器兼容,就应该可以使用新的F2008功能。这是唯一的可移植选项。