gfortran hello.f95
В этом случае, если исходный файл hello.f95 не содержит ошибок, в текущей директории будет создан исполнимый файл с именем: a.out – если используется какой-либо коммандер, то это сразу будет видно в таблице; иначе придется воспользоваться командой операционной системы:
ls (для Linux)
dir (для Windows)
Для запуска файла из командной строки Linux необходимо явное указание на текущую директорию: – «./». При запуске из командной строки Windows в этом нет необходимости:
./a.out (для Linux)
a (для Windows)
После запуска, на экране появится текст:
HELLO, WORLD
Если в процессе компиляции обнаружится наличие ошибок в тексте программы, то необходимо их исправить, а затем повторить процесс компиляции.
Создание исполняемого файла с заданным именем. Наиболее часто возникает ситуация, когда исполняемому файлу программы требуется присвоить такое же имя, как и у исходного файла. Для этого у компилятора Gfortran имеется специальная опция «–o имя», важно не перепутать латинскую букву «о» с нулем! Эту опцию можно указать в любом месте списка параметров компилятора
Gfortran, например:
gfortran -o hello hello.f95 |
или |
gfortran hello.f95 -o hello |
Правильное выполнение этой команды приведет к созданию исполнимого файла с именем hello (или hello.exe), который затем можно запустить обычным образом:
131
./hello (для Linux)
hello или hello.exe (для Windows)
Типичной ошибкой, на которую стоит обратить внимание, является попытка запустить исходный файл вместо исполняемого файла, т.е. в командной строке набирают ./hello.f95 вместо ./hello и т.д.
Пример 3.16. Программные компоненты в одномфайле
program MESSAGE |
! В файле hello.f95 |
call HELLO |
|
end |
|
subroutine HELLO! |
! В файле hello.f95 |
print*, 'HELLO,^WORLD' |
|
end |
|
Исходный файл может содержать несколько программных компонент – одну основную программу подпрограмму или несколько. Основная программа MESSAGE (пример 3.16) вызывает подпрограмму HELLO, печатающую уже знакомое текстовое сообщение «HELLO, WORLD». Для вызова подпрограммы используется опе-
ратор CALL (см. п. 3.7).
Поскольку все программные компоненты находятся в одном файле, то в написании и трансляции программы ничего не изменяется – создается исходный файл, например: message.f95, в котором размещается главная программа MESSAGE и подпрограмма HELLO, а затем исходный файл компилируется точно так же, как исходный файл hello.f95 в предыдущих примерах:
gfortran -o message message.f95
или же
gfortran message.f95 -o message
3.2.3. Трансляция нескольких исходных файлов
Программныекомпоненты одной программы могут размещаться отдельно в нескольких исходных файлах. Основная программа
132
MESSAGE может размещаться в файле message.f95 (пример 3.17), а подпрограмма HELLO в файле hello.f95 (пример 3.18).
Пример 3.17. Файл message.f95
program MESSAGE ! В файле hello.f95 call HELLO
end
Пример 3.18. Файл hello.f95
subroutine HELLO ! В файле hello.f95 print*, 'HELLO,^WORLD'
end
Компиляция с созданием исполняемого файла. При трансля-
ции имена исходных файлов перечисляются в произвольном порядке, а опция «–о massage» определяет имя исполняемого файла:
gfortran -о massage hello.f95 message.f95
или
gfortran message.f95 hello.f95 -о massage
Напомним, что в принципе исполняемый файл может называться как угодно, но во избежание путаницы его, как правило, именуют так же, как и главную программу.
Компиляция с созданием объектных файлов. В ряде случаев интерес может представлять компиляция исходных файлов с их преобразованием в машинный код, без сборки исполняемого файла. Для этого компилятор gfortran необходимо запустить с опцией «–c», т.е. только компиляция. Файлы могут компилироваться по одному или по нескольку:
gfortran -c hello.f95
gfortran -c message.f95
или
133
gfortran -c hello.f95 message.f95
В любом случае результатом будет появление в текущей директории объектных файлов: hello.о и message.о, из которых затем можно осуществить сборку исполняемого файла так же, как из исходников:
gfortran -o massage hello.o message.o
Исходные файлы всегда сначала компилируются в объектные файлы, а уже затем из объектных файлов специальной программой, называемой редактором связей или линкером (линковщиком), осуществляется сборка исполняемого файла. Транслятор gfortran просто скрывает этот этап (если текста программ в исходных файлах достаточно для полного цикла генерации исполняемого файла).
При работе над большими проектами компиляция занимает значительное время, из-за чего постоянно перекомпилировать исходные файлы с уже отлаженным кодом нет никакого смысла, поэтому для сборки проекта удобнее пользоваться уже скомпилированными объектными файлами.
Компилятор gfortran поддерживает смешанную обработку исходных и объектных файлов, которые могут быть перечислены через пробел в любом порядке:
gfortran -o message hello.o message.f95
или
gfortran -o message hello.f95 message.o
Для получения более полных сведений о возможностях транслятора Gfortran следует воспользоваться опцией «--help»:
gfortran --help
134
3.2.4. Трансляция модулей
Исходный файл, содержащий модуль (пример 3.19), необходимо компилировать с опцией «-c» (только компиляция):
gfortran -c vector_arithmetic.f95
Успешное выполнение этой команды приведет к появлению в текущей директории специализированного файла структуры модуля
(vector_arithmetic.mod) и объектного файла (vector_arithmetic.o),
который затем необходимо транслировать вместе с использующей его программой (см. пример 3.19) по уже известным правилам трансляции программы, расположенной в нескольких файлах:
gfortran -o vector_test vector_test.f95 vector_arithmetic.o
или
gfortran -o vector_test vector_arithmetic.o vector_test.f95
Пример 3.19. Модуль – контейнервекторной арифметики module VECTOR_ARITHMETIC
type VECTOR real X, Y
end type VECTOR interface operator(+)
module procedure ADD_VECTORS end interface
contains
function ADD_VECTORS(A,B) type(VECTOR) ADD_VECTORS type(VECTOR), intent(in) :: A, B ADD_VECTORS%X = A%X +B%X ADD_VECTORS%Y = A%Y +B%Y end function ADD_VECTORS
end module VECTOR_ARITHMETIC
Возможна трансляция с использованием только исходных файлов, но при этом важна очередность их следования – первым должен быть указан файл, содержащий модуль, и только затем указывается исходный файл программы, использующей это модуль:
135