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)
两个编译器都在修改模块中包含的子程序的名称.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)
因此,您可以fun
像foo
在库中一样引用函数.您可能还想使用iso_c_binding
模块定义的类型.
归档时间: |
|
查看次数: |
251 次 |
最近记录: |