make:***没有制定目标的规则 - gfortran

时间:2018-06-10 21:02:17

标签: macos makefile fortran gfortran

我正在尝试编译代码 - 这段代码使用了一些库,对于初学者,我正在尝试创建一个makefile来获取一个库 我遇到了困难。 这是makefile

HOME        = $(shell pwd)
LIBNA       = libbv.a
LIBZP       = $(HOME)/$(LIBNA)

# FFLAGC      = -Mextend -Msave -g -C -Mchkfpstk -Mchkptr -fpic -Ktrap=fp


FC = gfortran
 ifeq ($(OSTYPE),linux)
        FC = pgf95 -Msave -fpic
 endif

# per il gfortran
 FFLAGC      = -g -Wall-ffixed-line-length-0 -Mextend -Msave -g -C -Mchkfpstk -Mchkptr -fpic -Ktrap=fp

# FC = gfortran
#

SOURCE = \
filename1.f\
filename2.f\
...
filenamen.f


.SUFFIXES: .f




OBJ = $(SRCS:.f=.o)

.f.o:
    $(FC) $(FFLAG)   -c   $< $@


$(LIBZP): $(LIBZP)($(OBJ))
    ar -r $(LIBZP) $?
    rm -f $?

这是我正在使用的makefile。 我收到了错误

  

make:***没有规则来制作目标absolutepath/libbv.a()', needed by absolute_path / libbv.a&#39;。停止。

我想知道你们中是否有人可以提供帮助

1 个答案:

答案 0 :(得分:2)

嗯,您的错误消息显示了这个:

absolutepath/libbv.a()

括号内没有任何内容。但你的makefile有这个:

$(LIBZP): $(LIBZP)($(OBJ))

括号中有$(OBJ)。很明显,$(OBJ)正在扩展为空字符串。那是为什么?

嗯,OBJ设置在这里:

OBJ = $(SRCS:.f=.o)

基于SRCS。那么,该变量包含什么?

啊哈。什么都没有,因为它从未设定过。你设置了这个:

SOURCE = \
    ...

SOURCE!= SRCS,所以你要修改一个空变量,OBJ是空字符串。

我不确定你为什么要在目标前添加当前目录...如果你没有指定任何目录,默认情况下就是这样。无论如何,您可以使用$(CURDIR)而不是$(shell pwd)

如果您打算使用GNU make,我建议您使用模式规则而不是后缀规则:它们更易于阅读/理解:

%.o : %.f
        $(FC) $(FFLAG) -c $< $@

-o之前,您还不需要$@吗?我不使用Fortran编译器,但我认为它们与C / C ++编译器的工作方式大致相同。