Makefile与Fortran和C混淆

时间:2013-04-30 20:19:49

标签: c makefile fortran icc intel-fortran

这是我第一次制作一个make文件。我有点困惑,因为我的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

我是在正确的轨道上吗?

2 个答案:

答案 0 :(得分:2)

你的makefile有很多问题,而且在编译不同的.o文件时你不能包含.o文件。 .o文件仅发送到链接器,但使用ifort的-c标志告诉它创建一个对象而链接它。顺便说一下,如果你正确地格式化这个例子,它将帮助我们理解你的问题:你的空白非常奇怪,难以阅读。

我想你想要这样的东西;这构建了一个名为“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 $@ $^
%.o: %.c
        $(CC) -c $(CFLAGS) -o $@ $<
%.o: %.f90 
        $(FC) -c $(FCFLAGS) -o $@ $<

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

这看起来更长,但是如果/当您需要添加更多源文件时,您只需将它们放入SRCS变量(并声明任何额外的先决条件)。

答案 1 :(得分:0)

pi.o需要timing.o,而不是timing.c timing.h,在您的fortran食谱中交换两者。应该是这样的:

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