Makefile 要使用静态库编译的通用Gfortran生成文件
我正在尝试创建一个非常依赖BLAS的程序。不过,我以前从未制作过依赖于静态库的可执行文件。到目前为止,我了解到我需要使用以下方法创建BLAS静态库:Makefile 要使用静态库编译的通用Gfortran生成文件,makefile,fortran,gfortran,blas,Makefile,Fortran,Gfortran,Blas,我正在尝试创建一个非常依赖BLAS的程序。不过,我以前从未制作过依赖于静态库的可执行文件。到目前为止,我了解到我需要使用以下方法创建BLAS静态库: gfortran -O2 -c *.f ar cr libblas.a *.o 显然,在此之后,您可以在命令行上使用-lblas将程序与BLAS链接 我的make文件如下所示,基本上是从联机复制的: # ====================================================================== #
gfortran -O2 -c *.f
ar cr libblas.a *.o
显然,在此之后,您可以在命令行上使用-lblas将程序与BLAS链接
我的make文件如下所示,基本上是从联机复制的:
# ======================================================================
# Declarations
# ======================================================================
# The compiler
FCOMP = gfortran
# flags for debugging or for maximum performance, comment as necessary
FCFLAGS = -g -O2
# libraries needed for linking
LDFLAGS = -lblas
# List of executables to be built within the package
PROGRAM = prog_name_here
# List of subroutines to be built within the package
OBJECTS = foo1.f08 foo2.f08 foo3.f08 ....
# "make" builds all
all: $(PROGRAM)
# ======================================================================
# General Rules
# ======================================================================
# General rule for building prog from prog.o; $^ (GNU extension) is
# used in order to list additional object files on which the
# executable depends
%: %.o
$(FCOMP) $(FCFLAGS) -o $@ $^ $(LDFLAGS)
# General rules for building prog.o from prog.f90 or prog.F90; $< is
# used in order to list only the first prerequisite (the source file)
# and not the additional prerequisites such as module or include files
%.o: %.f08
$(FCOMP) $(FCFLAGS) -c $<
%.o: %.F08
$(FCOMP) $(FCFLAGS) -c $<
%.o: %.f90
$(FCOMP) $(FCFLAGS) -c $<
%.o: %.F90
$(FCOMP) $(FCFLAGS) -c $<
# Utility targets
.PHONY: clean veryclean
clean:
rm -f *.o *.mod *.MOD
veryclean: clean
rm -f *~ $(PROGRAMS)
有人能强调一下如何正确链接静态库吗
**编辑1**
我已经将libblas.a放在了与.f08/makefile相同的目录中,很可能这是一个相关的点
**编辑2**
我注意到从工作目录中删除libblas.a没有什么区别。我也犯了同样的错误。我不认为makefile正在调用/使用它。您必须先在blas存档(库)上运行
ranlib
,然后才能使用它
gfortran -O2 -c *.f
ar cr libblas.a *.o
ranlib libblas.a
有用链接:您必须先在blas存档(库)上运行
ranlib
,然后才能使用它
gfortran -O2 -c *.f
ar cr libblas.a *.o
ranlib libblas.a
有用链接:正如其他人所说,您看到的链接错误与
libblas
但是你自己的代码
我怀疑你的makefile看起来像你发布的那个
那一个根本没有定义使$(程序)
的规则,所以它
甚至连连接错误都没有
试试这样一个:
FCOMP = gfortran
FCFLAGS = -g -O2
LDFLAGS = -lblas
PROGRAM = prog_name_here
SRCS = foo1.f08 foo2.f08 foo3.f08 ...
OBJECTS = $(SRCS:.f08=.o)
all: $(PROGRAM)
$(PROGRAM): $(OBJECTS)
$(FCOMP) $(FCFLAGS) -o $@ $^ $(LDFLAGS)
%.o: %.f08
$(FCOMP) $(FCFLAGS) -c $<
.PHONY: clean veryclean
clean:
rm -f *.o *.mod *.MOD
veryclean: clean
rm -f *~ $(PROGRAM)
如果在运行make
的目录中构建libblas.a
,则:
LDFLAGS = -L. -lblas
正如其他人所说,您看到的链接错误与
libblas
但是你自己的代码
我怀疑你的makefile看起来像你发布的那个
那一个根本没有定义使$(程序)
的规则,所以它
甚至连连接错误都没有
试试这样一个:
FCOMP = gfortran
FCFLAGS = -g -O2
LDFLAGS = -lblas
PROGRAM = prog_name_here
SRCS = foo1.f08 foo2.f08 foo3.f08 ...
OBJECTS = $(SRCS:.f08=.o)
all: $(PROGRAM)
$(PROGRAM): $(OBJECTS)
$(FCOMP) $(FCFLAGS) -o $@ $^ $(LDFLAGS)
%.o: %.f08
$(FCOMP) $(FCFLAGS) -c $<
.PHONY: clean veryclean
clean:
rm -f *.o *.mod *.MOD
veryclean: clean
rm -f *~ $(PROGRAM)
如果在运行make
的目录中构建libblas.a
,则:
LDFLAGS = -L. -lblas
是
\u direct\u find\u
,\u kernel\u correction\u
,等等。BLAS中的符号?这些是程序一致性检查中的子例程。如果这些是一致性检查中的符号,那么必须首先研究在编译一致性检查后这些符号不可用的原因。如deepak所说,如果这些是您的符号,那么您需要找出它们在构建中丢失的原因。你能在一致性检查中看到它们吗,等等。BLAS中的符号?这些是程序一致性检查中的子例程。如果这些是一致性检查中的符号,那么必须首先研究在编译一致性检查后这些符号不可用的原因。如deepak所说,如果这些是您的符号,那么您需要找出它们在构建中丢失的原因。你能在一致性检查中看到它们吗?他并不是根据我所能说的来构建libblas的(尽管文章顶部有说明)。我在blas档案中运行了ranlib
,但似乎没有什么不同。有趣的是,没有提到这一步。(补充了问题的最新信息)。他不是根据我所能说的来构建libblas的(尽管帖子顶部有说明)。我在blas档案上运行了ranlib
,但似乎没有什么不同。有趣的是,没有提到这一步。(对问题进行了更新)。