2013-04-30 4 views
0

Это мой первый раз, когда вы делаете make-файл. Я немного запутался, так как мой код Fortran использует некоторые функции, определенные в исходных файлах C. Это то, что я написал до сих пор:Смешение Makefile с Fortran и C

 CC = icc 
     FC = ifort 
     FCFLAGS = -O3 -xHost -fno-alias$(INCLUDES) 
     CFLAGS = -O3 -xHost -fno-alias$(INCLUDES) 
     LIBS = 
     INCLUDES = 
     TARGET = run 
     OBJS: pi.o\ 
     timing.o 
     timing.o: timing.c timing.h 
    $(CC) -c $(CFLAGS) timing.c 
      pi.o: pi.f90 timing.c timing.h 
     $(FC) -c $(FCFLAGS) timing.o pi.f90 
      .PHONY : clean 
      clean: rm -f *.o 

Я нахожусь на правильном пути?

+0

Всегда используйте тег [tag: fortran] и добавляйте только версию, когда это необходимо, чтобы отличить ваш вопрос. Например, вы не можете использовать Fortran 2008, но только Fortran 90. –

ответ

0

pi.o требуется timing.o, а не timing.c timing.h, поменяйте местами два в рецепте fortran. Должно выглядеть так:

pi.o: pi.f90 timing.o 
     $(FC) -c $(FCFLAGS) timing.o pi.f90 
+0

Хорошо, спасибо за ваш ответ. Помимо того, что вы упомянули, make-файл кажется разумным? – gmajal

+0

Я не пробовал комбинировать fortran и C раньше. При попытке найти примеры (для поиска [fortran with c]), похоже, рекомендуется скомпилировать каждый объектный файл (*. O), а затем скомпилировать его в исполняемый файл. Лучшая ссылка, которую я мог найти: http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html поиск ans для программы FORTRAN, вызывающей функцию C. – Greg

1

У вас есть ряд проблем с Makefile, а также вы не можете включить .o файл при компиляции другого .o файла. .o файлы отправляются только в компоновщик, но с использованием флага -c в ifort указывается, что он создает объект, а не. Кстати, это поможет нам понять ваш вопрос, если вы правильно отформатируете пример: ваши пробелы очень странные, что усложняет чтение.

Я думаю, вы хотите что-то подобное; это создает программу с именем «run».

CC = icc 
FC = ifort 
FCFLAGS = -O3 -xHost -fno-alias $(INCLUDES) 
CFLAGS = -O3 -xHost -fno-alias $(INCLUDES) 
LIBS = 
INCLUDES = 
TARGET = run 
OBJS = pi.o timing.o 

$(TARGET) : $(OBJS) 
     $(FC) -o $(TARGET) $(OBJS) 
timing.o: timing.c timing.h 
     $(CC) -c $(CFLAGS) timing.c 
pi.o: pi.f90 
     $(FC) -c $(FCFLAGS) pi.f90 
.PHONY : clean 
clean: 
     rm -f *.o 

Или, если вы хотите использовать некоторые более причудливые особенности макияжа и избежать повторного ввода, вы можете использовать:

CC = icc 
FC = ifort 
FCFLAGS = -O3 -xHost -fno-alias $(INCLUDES) 
CFLAGS = -O3 -xHost -fno-alias $(INCLUDES) 
LIBS = 
INCLUDES = 
TARGET = run 
SRCS = pi.f90 timing.c 

timing.o: timing.h 

OBJS = $(addsuffix .o,$(basename $(SRCS)) 

$(TARGET) : $(OBJS) 
     $(FC) -o [email protected] $^ 
%.o: %.c 
     $(CC) -c $(CFLAGS) -o [email protected] $< 
%.o: %.f90 
     $(FC) -c $(FCFLAGS) -o [email protected] $< 

.PHONY : clean 
clean: 
     rm -f *.o 

Это выглядит больше, но если/когда необходимо добавить дополнительные исходные файлы все, что вам нужно сделать, это поместить их в переменную SRCS (и объявить любые дополнительные предварительные условия).