Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 要使用静态库编译的通用Gfortran生成文件_Makefile_Fortran_Gfortran_Blas - Fatal编程技术网

Makefile 要使用静态库编译的通用Gfortran生成文件

Makefile 要使用静态库编译的通用Gfortran生成文件,makefile,fortran,gfortran,blas,Makefile,Fortran,Gfortran,Blas,我正在尝试创建一个非常依赖BLAS的程序。不过,我以前从未制作过依赖于静态库的可执行文件。到目前为止,我了解到我需要使用以下方法创建BLAS静态库: gfortran -O2 -c *.f ar cr libblas.a *.o 显然,在此之后,您可以在命令行上使用-lblas将程序与BLAS链接 我的make文件如下所示,基本上是从联机复制的: # ====================================================================== #

我正在尝试创建一个非常依赖BLAS的程序。不过,我以前从未制作过依赖于静态库的可执行文件。到目前为止,我了解到我需要使用以下方法创建BLAS静态库:

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
,但似乎没有什么不同。有趣的是,没有提到这一步。(对问题进行了更新)。