Проблема компиляции Fortran 90: неопределенная ссылка на ‹modulename›

У меня возникли проблемы с попыткой скомпилировать простую программу на Фортране, которая использует модуль в том же каталоге. У меня есть 2 файла: test1.f90, который содержит программу, и modtest.f90, который содержит модуль.

Это test1.f90:

program test
  use modtest
  implicit none
  print*,a
end program test

Это модтест.f90:

module modtest
  implicit none
  save
  integer :: a = 1
end module modtest

Оба файла находятся в одном каталоге. Я компилирую modtest.f90 и test.f90 следующим образом:

gfortran -c modtest.f90
gfortran -o test1 test1.f90

Но затем я получаю эту ошибку:

/tmp/cckqu8c3.o: In function `MAIN__':
test1.f90:(.text+0x50): undefined reference to `__modtest_MOD_a'
collect2: ld returned 1 exit status

Есть что-то, что мне не хватает? Спасибо за помощь


person Eddy    schedule 11.10.2010    source источник
comment
@PreetSangha: я не понимаю, что вы говорите. (А как насчет вопросов по программированию? Под Итак, вы имеете в виду StackOverflow — если да, то это должно быть ТАК. Спросите, что, если вы не знаете, что?)   -  person jvriesem    schedule 29.03.2018
comment
Комментарий, на который я ответил, похоже, был удален. Я думаю, что этот человек спрашивал, почему строительство было вопросом программирования. Во всяком случае, это было почти десять лет назад :-)   -  person Preet Sangha    schedule 30.03.2018


Ответы (1)


Что вы делаете, так это не сообщаете компоновщику, где находится эталонный модуль modtest, чтобы ваш код мог использовать его содержимое.

Это должно работать:

gfortran -o test1 test1.f90 modtest.o

Некоторый контекст:

Опция -o указывает компилятору поместить вывод полной сборки (компиляция + ссылка) в программу с именем test1. Затем мы предоставляем файл, который мы должны скомпилировать (test1.f90). Наконец, мы говорим компилятору рассмотреть файл, содержащий скомпилированный вывод другой сборки (modtest.o), и связать его с скомпилированным выводом test1.f90, и использовать содержимое modtest.o при попытке отсортировать ссылки в test1.f90, которые сослаться на модуль modtest (в выражении use modtest в исходном коде).

Итак, в заявлении говорится:

Пожалуйста, скомпилируйте и затем свяжите test1.f90 с modtest.o и создайте файл с именем test1 в качестве окончательного вывода.

person Preet Sangha    schedule 11.10.2010
comment
Да, это так, спасибо! Я изучаю Фортран уже месяц, не могу поверить, что не знал этого :P - person Eddy; 11.10.2010
comment
Хотя эта команда действительно решает проблему, необходимо дать некоторое описание. Я буду рад отозвать свой отрицательный голос, как только ответ будет улучшен. - person Vladimir F; 22.02.2016
comment
Одного решения недостаточно. Укажите, почему это решает проблему. - person Bruce Becker; 21.09.2016
comment
Я использовал это как основу для компиляции гораздо более крупного проекта, но у меня возникла та же проблема. Будет ли это работать для программ, использующих модули, использующие другие модули? Пожалуйста, проверьте stackoverflow.com/questions/44870715/ - person user32882; 02.07.2017
comment
Вам нужно будет просмотреть параметры gfortran и посмотреть, есть ли дополнительные параметры, которые вам нужны. - person Preet Sangha; 04.07.2017