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
模块定义的类型。
有没有办法控制共享库中符号的命名?具体来说,我一直在将 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
模块定义的类型。