Подтвердить что ты не робот

Создание make файла FORTRAN

У меня есть исходный код FORTRAN, состоящий из множества разных .F и .h файлов. Мне нужно создать из него исполняемый файл, но у меня возникли проблемы. Файл makefile, который я создал до сих пор (который может иметь ошибки, поскольку я новичок в этом):

 # compiler
 FC = /usr/bin/gfortran-4.5

 # compile flags
 FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons
 # link flags
 FLFLAGS = -g -fbacktrace

 # source files and objects
 SRCS = $(patsubst %.F, %.o, $(wildcard *.F)) \
        $(patsubst %.h, %.mod, $(wildcard *.h))

 # program name
 PROGRAM = blah

 all: $(PROGRAM)

 $(PROGRAM): $(SRCS)
    $(FC) $(FCFLAGS) [email protected] $<

 %.o: %.F
    $(FC) $(FLFLAGS) -o [email protected] $<

 %.mod: %.h
    $(FC) $(FLFLAGS) -o [email protected] $<

 clean:
    rm -f *.o *.mod

Однако, когда я пытаюсь сделать программу, я получаю множество ошибок undefined. Я имею в виду, что каждый вызов функции и подпрограммы в самом первом скомпилированном .F файле возвращает опорную ошибку undefined. Я думал, что это потому, что gfortran пытался связать файлы, а не просто компилировать их, а затем связать в конце, но я думал, что опция -c 'должна была предотвратить это.

UPDATE:

Как отмечали комментаторы, я перепутал флагов компиляции и ссылок. Кроме того, вы не должны компилировать *.h файлы. Вот последний исправленный make файл:

# compiler
FC = /usr/bin/gfortran-4.4

# compile flags
FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons -fbounds-check -std=legacy
# link flags
FLFLAGS =

# source files and objects
SRCS = $(patsubst %.F, %.o, $(wildcard *.F))

# program name
PROGRAM = blah

all: $(PROGRAM)

$(PROGRAM): $(SRCS)
    $(FC) $(FLFLAGS) -o [email protected] $<

%.o: %.F
    $(FC) $(FCFLAGS) -o [email protected] $<

clean:
    rm -f *.o *.mod

Теперь, когда я запустил make, он скомпилирует каждый *.F файл в коде, но на этапе связывания он не работает. Я получаю кучу справочных ошибок undefined в самом первом *.F файле. Кажется, что компилятор просматривает каждый *.F файл на этапе компоновки, что я не уверен, что это правильно. Затем я получаю сообщение об ошибке:

/usr/lib/gcc/x86_64-linux-gnu/4.4.5/libgfortranbegin.a(fmain.o): In function `main':
(.text+0x26): undefined reference to `MAIN__'
collect2: ld returned 1 exit status

Однако, если я наберу команду:

gfortran -o blah *.o

Исполняемый файл будет создан, поэтому кажется, что я сделал что-то не так в make файле для этапа компоновки.

ОБНОВЛЕНИЕ: 5/9/2011

Сверре указал на окончательную проблему с моим make файлом. В моей первой цели, которая строит программу, я использую команду shortcut только для первой зависимости ($ <), но мне нужно включить все зависимости (т.е. Все файлы *.o) с помощью ($ ^) ярлыка. Окончательный рабочий файл выглядит следующим образом:

# compiler
FC      := /usr/bin/gfortran-4.5

# compile flags
FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons -fbounds-check
# link flags
FLFLAGS =

# source files and objects
SRCS = $(patsubst %.F, %.o, $(wildcard *.F))
#       $(patsubst %.h, %.mod, $(wildcard *.h))

# program name
PROGRAM = vipre

all: $(PROGRAM)

$(PROGRAM): $(SRCS)
    $(FC) $(FLFLAGS) -o [email protected] $^

%.o: %.F
    $(FC) $(FCFLAGS) -o [email protected] $<

# %.mod: %.h
# $(FC) $(FCFLAGS) -o [email protected] $<

clean:
    rm -f *.o *.mod
4b9b3361

Ответ 1

Вы используете GNU make? Если да,

$(FC) $(FLFLAGS) -o [email protected] $<

может быть виновником. $< - это имя первого предварительного условия, но вы хотите, чтобы все файлы *.o. Вместо этого используйте $^.