У меня есть подпрограмма фортрана в файле gfunc.f90
.Я хочу вызвать эту подпрограмму из моей основной программы в test.f90
.
Если я сохраню оба файла в одном каталоге и скомпилирую их с помощью
gfortran gfunc.f90 test.f90 -o test
Itработает нормально.
Но я хочу, чтобы подпрограмма была в библиотеке.Таким образом, я создаю подпапку с именем 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
:
program main
use gfunc_module
implicit none
integer, parameter :: dp = kind(1.0d0)
real(dp) :: x = 1.
integer, parameter :: n = 4
integer, parameter :: m = 4
real(dp), dimension(n) :: a = [-1., -0.33333333, .033333333, 1.]
real(dp), dimension(m) :: b = [-1., -0.33333333, .033333333, 1.]
real(dp), dimension(n, m) :: c
call gfunc(x, n, m, a, b, c)
write(*,*) c
end program main