Ошибка сегментации общего объекта Fortran - PullRequest
0 голосов
/ 15 октября 2018

У меня есть подпрограмма фортрана в файле 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

1 Ответ

0 голосов
/ 15 октября 2018

Вы должны добавить fdefault-real-8 к вашей компиляции test.f90:

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

Из документации для gfortran -fdefault-real-8 делает DOUBLE PRECISION переменные шириной 16 байтов,поэтому без него на test.f90 переменные двойной точности имеют ширину всего 8 байт:

-fdefault-real-8

Установите для действительного типа по умолчанию значение8-байтовый тип.Ничего не делать, если это уже по умолчанию.Эта опция также влияет на тип не двойных вещественных констант, таких как 1.0, и увеличивает ширину по умолчанию «DOUBLE PRECISION» до 16 байт, если это возможно, если только не задан «-fdefault-double-8».

...