来自Fortran共享对象的分段错误

时间:2018-10-15 13:32:52

标签: compilation linker fortran shared-libraries gfortran

我在文件56px中有一个fortran子例程。我想从gfunc.f90的主程序中调用此子例程。

如果我将两个文件都放在同一个目录中,并使用

进行编译

test.f90

它工作正常。

但是我希望子例程在库中。因此,我创建了一个名为gfortran gfunc.f90 test.f90 -o test的子文件夹,并将gfunc/放在此处。在那个文件夹中,我用

gfunc.f90

gfortran -fdefault-real-8 -fPIC -c gfunc.f90

我现在用...编译主程序

gfortran -fdefault-real-8 -shared -o gfunc.so gfunc.o

但是现在一旦访问子例程中的变量,我就会遇到分段错误。

如何正确编译和链接库?

在这里,您找到了一个最小的工作示例来重现该问题:

gfortran test.f90 gfunc/gfunc.so

gfunc.f90

module gfunc_module implicit none contains subroutine gfunc(x, n, m, a, b, c) double precision, intent(in) :: x integer, intent(in) :: n, m double precision, dimension(n), intent(in) :: a double precision, dimension(m), intent(in) :: b double precision, dimension(n, m), intent(out) :: c integer :: i, j do j=1,m do i=1,n c(i,j) = exp(-x * (a(i)**2 + b(j)**2)) end do end do end subroutine end module

test.f90

1 个答案:

答案 0 :(得分:4)

您应该将fdefault-real-8添加到您的test.f90编译中:

gfortran -fdefault-real-8 test.f90 gfunc/gfunc.so

documentation for gfortran -fdefault-real-8开始,DOUBLE PRECISION变量的宽度为16个字节,因此在test.f90上没有它,双精度变量的宽度仅为8个字节:

  

-fdefault-real-8

     

将默认实型设置为8字节宽的类型。如果这已经是默认设置,则不执行任何操作。此选项还会影响非双实数常量(如1.0)的类型,并且会尽可能将“ DOUBLE PRECISION”的默认宽度提高到16个字节,除非也给出了“ -fdefault-double-8”。