Подключаемые файлы и модули#
Ваша программа может содержаться в различных файлах исходного кода, хранящихся в одном каталоге или размещённых внутри удобного дерева каталогов. Детали организации размещения зависят от личного вкуса, договорённости группы разработчиков, к которой вы принадлежите, или просто от истории разработки программы. Какой бы ни была структура каталогов, вы столкнётесь с ситуацией, когда компилятору потребуется помощь для компиляции определённого файла исходного кода:
В Fortran (и других языках программирования) имеется возможность подключить внешний файл. Хотя эта возможность стала немного менее полезной с появлением модулей, она всё ещё имеет своё применение. Довольно часто такие «подключаемые файлы» хранятся в каталоге, отдельном от каталогов с файлами исходных кодов программы, поскольку они используются в нескольких местах. Чаще всего этот каталог называется «include».
Как мы видели, компиляция исходного кода, определяющего один или несколько модулей, приводит к тому, что компилятор создаёт так «промежуточные файлы модулей» (с расширением файла «.mod»). Компилятору необходим доступ к этим файлам, чтобы иметь возможность прочитать информацию об интерфейсах, переменных и т.д., и на основе этой информации компилировать исходный код, использующий различные модули.
Компиляторы поддерживают опции, наподобие -I
, чтобы можно было указать, где искать эти подключаемые файлы и промежуточные файлы модулей. Предположим, что мы храним два файла нашей программы tabulate
в следующей структуре каталогов:
tabulate/
main/
tabulate.f90
sub/
functions.f90
Компиляция файла «functions.f90» с помощью последовательности команд
$ cd sub
$ gfortran -c functions.f90
приведёт к созданию следующей структуры файлов:
tabulate/
main/
tabulate.f90
sub/
functions.f90
user_functions.mod
functions.o
Для успешной компиляции и последующей сборки программы нам необходимо указать компилятору, где он может найти файл «user_functions.mod»:
$ cd main
$ gfortran -c tabulate.f90 -I ../sub
$ gfortran -o tabulate tabulate.o ../sub/functions.o
В результате получим:
tabulate/
main/
tabulate.f90
tabulate.o
tabulate (or tabulate.exe on Windows)
sub/
functions.f90
functions.o
user_functions.mod
Примечания:
Детали отличаются в зависимости от компилятора. Иногда после опции
-I
должен следовать пробел, а затем указывается имя каталога; иногда имя каталога указывается сразу за опцией, без отделения пробелом.По умолчанию промежуточные файлы модулей (.mod) помещаются в тот же каталог, что и объектные файлы. Когда файлы исходного кода вашей программы расположены в разных подкаталогах, они будут разбросаны по дереву каталогов, усложняя процесс компиляции. К счастью, многие компиляторы позволяют указать место сохранения этих файлов. Для компилятора gfortran это делается с помощью опции
-J
, например:-J../include
(чтобы все файлы с расширением .mod находилось в одном каталоге)Для больших программ, состоящих из множества файлов исходного кода, важно продумать, какую организационную структуру использовать.