1

这是我第一次制作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

我在正确的轨道上吗?

4

2 回答 2

2

您的 makefile 存在许多问题,而且.o在编译不同的文件时不能包含.o文件。 .o文件只发送到链接器,但使用-cifort 标志告诉它创建一个对象而不是链接它。顺便说一句,如果您正确格式化示例,它将帮助我们理解您的问题:您的空格很奇怪,使事情难以阅读。

我想你想要这样的东西;这将构建一个名为“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

或者,如果您想使用 make 的一些更花哨的功能并避免打字,您可以使用:

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 变量中(并声明任何额外的先决条件)。

于 2013-04-30T21:06:16.353 回答
0

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

pi.o: pi.f90 timing.o 
        $(FC) -c $(FCFLAGS) timing.o pi.f90
于 2013-04-30T20:32:28.633 回答