Я пытаюсь написать некоторые функции/подпрограммы в модуле, которые вызывают другую функцию в том же модуле и сталкиваются с ошибками компоновщика. Игрушечный пример с таким же поведением:
!in test.f
module m1
implicit none
contains
real function mult(a, b)
real :: a
real :: b
mult = a * b
return
end function mult
real function sq(a)
real :: a, mult
sq = mult(a, a)
return
end function sq
end module m1
program main
use m1
write(*,*) sq(2.0)
end program
Когда я пытаюсь скомпилировать это, у меня возникают проблемы:
[christopher@archlinux metropolis]$ gfortran -ffree-form test.f
/tmp/ccpzdTLE.o: In function `__m1_MOD_sq':
test.f:(.text+0x20): undefined reference to `mult_'
collect2: error: ld returned 1 exit status
С другой стороны, компиляция только(gfortran -c -ffree-form test.f -Wall
)едет без нареканий.
Теперь это выглядит для всего мира как ошибка компилятора ---в модуле, в котором появляется ссылка на mult_
, когда на самом деле должно быть__m1_MOD_sq
---но мне очень трудно поверить, что это ошибка компилятора, а не то, что я делаю что-то глупое.
DDG не нашел ничего полезного. Большинство подобных проблем возникало при отделении модуля от одного основного файла. В этих случаях все работало, когда модуль находился в том же файле, что и program
, а здесь это не так. Я просмотрел несколько страниц о модулях на Фортране и не нашел ничего подходящего.
Может ли кто-нибудь указать мне соответствующую документацию или, что еще лучше, объяснить, что происходит и как я могу это исправить?