Подключаемые файлы и модули#

Ваша программа может содержаться в различных файлах исходного кода, хранящихся в одном каталоге или размещённых внутри удобного дерева каталогов. Детали организации размещения зависят от личного вкуса, договорённости группы разработчиков, к которой вы принадлежите, или просто от истории разработки программы. Какой бы ни была структура каталогов, вы столкнётесь с ситуацией, когда компилятору потребуется помощь для компиляции определённого файла исходного кода:

  • В 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 находилось в одном каталоге)

  • Для больших программ, состоящих из множества файлов исходного кода, важно продумать, какую организационную структуру использовать.