循环依赖关系丢失:make,fortran和c构建静态库

时间:2016-05-10 13:08:09

标签: c makefile fortran

我正在尝试使用混合c和fortran代码构建一个静态库。在构建fortran文件时,我会收到每个fortran文件的错误,但不会收到c文件。

make: Circular file0.F90 <- file0.F90.o dependency dropped.
mpif90 -c -O2 -o "file0.F90.o" "file0.F90"

我正在使用的Makefile如下。我对F90文件的规则与c文件的规则相同,所以我不确定为什么它应该有这种行为?

CC = mpicc
FC = mpif90

TARGET=libpxn   
FCFLAGS    = -O2 -fPIC
CFLAGS     = -O2 -fPIC -lm -Wall
CPPFLAGS   = $(CFLAGS)

SRCS = $(wildcard *.F90) $(wildcard *.c)
OBJS =  $(patsubst %, %.o, $(SRCS)) 

# Rules
all: static

static: $(OBJS) 
    ar rcs $(TARGET).a  $(OBJS)

%.c.o: %.c 
    $(CC) -c $(CFLAGS) -o "$@" "$<"

%.F90.o: %.F90
    $(FC) -c $(FCFLAGS) -o "$@" "$<"

clean: 
    @printf "Cleaning: \n"
    @find . -type f -name '*.o' -print0 | xargs -0 -I % sh -c 'printf "% "; rm -f %'
    rm -f $(TARGET).so $(TARGET).a

我也尝试过使用相同结果的gnu编译器。任何想法为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

.c是一个内置后缀,这意味着至少有一个内置规则被定义为%.c:,这将阻止make应用匹配任何规则(%:)以.c结尾的文件。

另一方面,Make不知道.F90,所以当它达到%.F90.o规则的先决条件时,它会尝试应用匹配任何规则%: %.o,这会导致file0.F90: file0.F90.o,以及循环依赖。

快速而肮脏的解决方案是简单地为.F90

添加空模式规则
%.F90:

&#34;正确&#34;处理这个问题的方式(恕我直言)将重写你的makefile以符合内置的隐式规则

TARGET  := libpxn.a
CC      := mpicc
FC      := mpif90
FFLAGS  := -O2 -fPIC
CFLAGS  := -O2 -fPIC -Wall
ARFLAGS := rcs

CSRCS := $(wildcard *.c)
FSRCS := $(wildcard *.F90)
OBJS  := $(CSRCS:.c=.o) $(FSRCS:.F90=.o)

.PHONY: all clean

all: $(TARGET)($(OBJS))

%.o: %.F90
    $(COMPILE.F) $(OUPUT_OPTION) $<

%.F90:

clean: 
    $(info "Cleaning:")
    $(RM) $(TARGET)

Make有一个内置的归档规则,因此您只需指定ARFLAGS并使用libname(objects)作为先决条件(IIRC,如果您使用GNU ar,则不要# 39; t需要s,因为它总是会制作索引。

F90配方是从.F的make内置规则中复制的,实际上如果您使用.F作为fortran后缀而不是.F90你甚至不需要这条规则。

如果您有两个具有相同词干的源文件(例如foo.cfoo.F90),则您必须将源拆分为两个子目录(推荐),或者返回到您的双重后缀的原始计划(在这种情况下,您需要再次提供这两个规则)。

我已经重写了clean,因为这些对象现在是中间文件,在将它们添加到存档后会自动删除。