Аргумент компоновщика gfortran для библиотеки, содержащей IEEE_GET_ROUNDING_MODE - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь написать простую библиотеку Фортрана для интервальной арифметики в качестве упражнения.Я хочу явно установить режим округления, выполнить некоторую работу, а затем восстановить режим округления до того, который был изначально.Тем не менее, я не могу понять, какую библиотеку нужно связать с результирующим исполняемым файлом при компиляции с gfortran, gcc интерфейсом Fortran.

! get_rounding_mode.f03
! print the rounding mode

program get_rounding_mode
  f = IEEE_GET_ROUNDING_MODE()
  print *,f
end program get_rounding_mode

Попытка сделать простейшую вещь, которая могла бы работать, даетme

gfortran get_rounding_mode.f03 
/usr/bin/ld: /tmp/ccTLaxeN.o: in function `MAIN__':
get_rounding_mode.f03:(.text+0x20): undefined reference to `ieee_get_rounding_mode_'
collect2: error: ld returned 1 exit status
Exit 1

Просматривая повсюду ieee_get_rounding Я нашел его, но я не знаю, как указать gfortran, чтобы связать его, поскольку он, кажется, уже находится в libgfortran.

find /usr/ -exec nm --print-file-name '{}' '+' 2>&1 | grep 'ieee_get_rounding'
/usr/lib/libgfortran.so.5:000000000023edc0 T __ieee_arithmetic_MOD_ieee_get_rounding_mode
/usr/lib/libgfortran.so:000000000023edc0 T __ieee_arithmetic_MOD_ieee_get_rounding_mode

1 Ответ

0 голосов
/ 28 декабря 2018

IEEE_GET_ROUNDING_MODE не является функцией.Это подпрограмма.Вам нужно сделать что-то вроде

program get_rounding_mode
   use ieee_arithmetic
   implicit none
   ieee_rounding_type mode
   real x
   if (ieee_support_rounding(x)) then
      call ieee_get_rounding_mode(mode)       ! Get current rounding mode
      call ieee_set_rounding_mode(IEEE_TO_UP) ! Set rounding up
      !
      ! Do your work here!
      !
      call ieee_set_rounding_mode(mode)       ! Reset rounding mode
   end if
 end program get_rounding_mode

Упс, забыл implicit none и объявление x

...