У меня есть исходный код 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) $@ $<
%.o: %.F
$(FC) $(FLFLAGS) -o $@ $<
%.mod: %.h
$(FC) $(FLFLAGS) -o $@ $<
clean:
rm -f *.o *.mod
Однако, когда я пытаюсь создать программу, я получаю множество неопределенных ссылочных ошибок. Я имею в виду, что каждый вызов функции и подпрограммы в самом первом скомпилированном .F файле возвращает неопределенную ошибку ссылки. Я думал, что это произошло из-за того, что gfortran пытался связать файлы вместо того, чтобы просто скомпилировать их и затем связать их в конце, но я думал, что опция '-c' должна была предотвратить это.
ОБНОВЛЕНИЕ:
Как написали комментаторы. указал, я перепутал флаги компиляции и ссылки. Кроме того, вам не следует компилировать файлы * .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 $@ $<
%.o: %.F
$(FC) $(FCFLAGS) -o $@ $<
clean:
rm -f *.o *.mod
Теперь, когда я запускаю make, он компилирует каждый * .F-файл в коде, но на этапе связывания происходит сбой. Я получаю кучу неопределенных ссылочных ошибок в самом первом * .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-файлом. В моей первой цели, которая создает программу, я использую команду быстрого доступа только для первой зависимости ($ <), но мне нужно включить все зависимости (т.е. все файлы * .o), используя ярлык ($ ^). Последний рабочий make-файл выглядит следующим образом:
# 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 $@ $^
%.o: %.F
$(FC) $(FCFLAGS) -o $@ $<
# %.mod: %.h
# $(FC) $(FCFLAGS) -o $@ $<
clean:
rm -f *.o *.mod