Создание файла из Fortran с фиксированной формой и без файлов

#makefile #fortran

#makefile #fortran

Вопрос:

Мне нужно создать программу из некоторых фиксированных и свободных файлов, включая некоторые модули. Я добавил all инструкцию в начало makefile. Затем мне нужно скомпилировать несколько .f90 файлов (они содержат несколько модулей). А затем я добавил правило для компиляции .f файлов.

Когда я запустил make, он сначала пытается скомпилировать .f файлы. Что я должен изменить / добавить?

Я использую gfortran в качестве компилятора.

Makefile выглядит следующим образом:

 All: exename

Firstf90.o: Firstf90.f90
<tab>gfortran -c

lt;
Secondf90.o: Second.f90
<tab>gfortran -c


lt;
%.o: %.f
<tab>gfortran -c $^

exename: *.o
<tab>gfortran -o exename $^

Комментарии:

1. Возможно, вам потребуется включить ваш makefile, чтобы люди могли лучше понять вопрос. вы пробовали удалять файлы .f? Часто они создаются из файлов .for, если у вас есть общие строки или #ifdef в смысле препроцессора.

2. Извините, добавлен пример

3. Эти файлы являются оригинальными, никаких инструкций в препроцессоре.

Ответ №1:

С помощью строки:

 exename: *.o
 

Вы говорите make , что exename это зависит от всех файлов с расширением .o . Но пока вы не создадите свой первый .o файл, их нет, что означает, что make он думает, что это вообще ни от чего не зависит.

Раздражает то, что, как только объектные файлы существуют, это Makefile делает именно то, что вы ожидаете, из-за чего трудно заметить, что с этим что-то не так.

Попробуйте что-то вроде этого:

 FIXED_SOURCES = $(wildcard *.f) 
FREE_SOURCES = $(wildcard *.f90)
FIXED_OBJECTS = $(patsubst %.f,%.o,${FIXED_SOURCES})
FREE_OBJECTS = $(patsubst %.f90,%.o,${FREE_SOURCES})

all : exename

${FIXED_OBJECTS} : %.o : %.f
<tab>gfortran -o $@ -c $^

${FREE_OBJECTS} : %.o : %.f90
<tab>gfortran -o $@ -c $^

exename : ${FIXED_OBJECTS} ${FREE_OBJECTS}
<tab>gfortran -o $@ $^
 

Примечание: Обычно я бы протестировал его перед публикацией, но в данный момент я не могу. Кроме того, у кого-то может быть более краткий Makefile для вас.

Ответ №2:

Когда я запустил make, он сначала пытается скомпилировать f файлов.

Это проблема? Если вам нужно скомпилировать их определенным образом, т. Е. Из-за модулей, Вы можете добавить зависимости в Makefile . Скажем mymod.f90 , создает модуль, который используется prog.f90 . Поэтому вам нужно скомпилировать mymod.f90 , прежде чем вы сможете скомпилировать prog.f90 . Просто: добавьте эту строку в Makefile :

 prog.o : mymod.o
 

Это объявляется mymod.o обязательным условием для prog.o , что означает, что перед prog.o компиляцией сначала mymod.o проверяется, существует ли он и является ли он актуальным.

Комментарии:

1. И чистый раздел для удаления файлов .o .mod и .lib … и т. Д. Если вы сделаете clean, а затем make, все будет свежим.