Вопрос по makefile, fortran –  вместо

15

я есть исходный код 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

Однако когда я пытаюсь создать программу, я получаю множество неопределенных ошибок в ссылках. Я имею в виду, что каждый вызов функции и подпрограммы в самом первом скомпилированном файле .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 [email protected] $<

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

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), используя ярлык ($ ^). Последний рабочий файл сборки выглядит следующим образом:

# 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
Кроме того, я хочу добавить к комментариям, что окончательное решение этого вопроса может не работать для исходных файлов F90, F2003 и F2008, потому что использование модулей налагает зависимости, а затем файлы объекта "* .o" имеют свои собственные зависимости, и они должны быть переупорядочено особым образом. В этом общем случае решение размещено вstackoverflow.com/questions/25705273/.... argasm
Похоже, вы пытаетесь построить свой*.h файлы, которые вам не нужно делать. Если я правильно помню,$< под%.mod: *.h выберу первый*.h файл. Может быть, вы хотите привести с*.F файлы, которые содержат модули? (хотя я должен признаться, я никогда не беспокоился о*.modв моих make-файлах) marshall.ward
Вы применяете флаги ссылки к компиляции, и наоборот. Neil Butterworth
У меня слишком много исходных и заголовочных файлов со слишком многими зависимостями, чтобы я мог сделать это вручную. Унаперссон, ты прав. Я по глупости поменял эти две переменные. Их переключение позволило мне собрать файлы .f. Gfortran дает мне ошибки для файлов .h. Кажется, они думают, что это C-файлы. Но это другой вопрос. Спасибо за помощь. Bob
Make - это просто способ автоматизации задач, которые вы можете выполнять вручную. Можете ли вы скомпилировать этот код в командной строке, без Make? Если нет, то возиться с make-файлом не поможет. Beta

Ваш Ответ

1   ответ
13

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

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

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

Да, это идеально. Я внес изменения, и это сработало. Окончательный рабочий make-файл опубликован в моем оригинальном вопросе. Самое смешное, что на самом деле я обнаружил make-файл для этого кода в моем офисе на днях. Тем не менее, это как в 20 раз больше, чем у меня, потому что они перечисляют каждую отдельную зависимость. Очень рад, что я узнал правильный способ сделать это. Bob
Обычно люди используют$(FFLAGS) вместо$(FLFLAGS) Mike T
если ответ решил вашу проблему, вы должны пометить его так steabert

Похожие вопросы