我在文件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
答案 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”。