我正在尝试编译代码 - 这段代码使用了一些库,对于初学者,我正在尝试创建一个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;。停止。
我想知道你们中是否有人可以提供帮助
答案 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 ++编译器的工作方式大致相同。