makefile - 使用静态库进行编译的通用 Gfortran Makefile

标签 makefile fortran gfortran blas

我正在尝试创建一个非常依赖 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)

当我收到错误时,我显然错误地链接了库:

gfortran -g -O2 -c Consistency_Check.f08
gfortran -g -O2 -o Consistency_Check Consistency_Check.o -lblas
Undefined symbols for architecture x86_64:
  "_direct_find_", referenced from:
      _MAIN__ in Consistency_Check.o
  "_kernel_correction_", referenced from:
      _MAIN__ in Consistency_Check.o
  "_output_", referenced from:
      _MAIN__ in Consistency_Check.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [Consistency_Check] Error 1
rm Consistency_Check.o

有人可以强调一下如何正确链接静态库吗?

** 编辑 1 ** 我已将 libblas.a 放在与 .f08/makefile 相同的目录中,以防这是相关点

** 编辑 2 ** 我注意到从工作目录中删除 libblas.a 没有什么区别。我犯了同样的错误。我不认为 makefile 正在调用/使用它。

最佳答案

正如其他人所说,您看到的链接错误与 libblas 无关 但到你自己的代码。

我怀疑你的 makefile 看起来像你发布的那样 根本没有定义创建 $(PROGRAM) 的规则,所以它 甚至不会出现链接错误。

尝试这样的:

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)

(请注意将拼写错误 $(PROGRAMS) 更正为 $(PROGRAM) veryclean 规则)。

至于将libblas链接为静态库,目前尚不清楚在哪里或为什么 你正在这样做,因为 a) 你的 makefile 没有构建它 b) 你的 Linux 发行版几乎肯定会提供它作为共享库 您可以安装的软件包。但是,如果您想构建它 然后静态链接它(这样做之后),你的 makefile 必须告诉 链接器使用L链接器选项搜索libblas.a的目录。 因此,将您的 LDFLAGS 更改为:

LDFLAGS = -L/path/to/your/liblas/build -lblas

如果您在运行 make 的目录中构建 libblas.a,则:

LDFLAGS = -L. -lblas

关于makefile - 使用静态库进行编译的通用 Gfortran Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32373787/

相关文章:

linux - Makefile、可执行文件和目标文件位于不同的目录中

linux - 如何提供Qt安装路径进行配置?

docker - 使用 Google Cloud Build,我如何运行 Makefile 来执行 docker 和 kubectl 命令?

arrays - 在子程序调用期间保持 Fortran 中的数组限制

fortran - 如果我不将 MPI_Isend 与 MPI_Wait 配对,我的程序是否需要增加内存量?

python - 将 Fortran 77 代码转换为 Python

c++ - makefile 混淆中的链接器库路径

Fortran 运行时警告 : Extension: $ descriptor

segmentation-fault - Fortran 认为未分配的数组已经分配

linux - 对 `blacs_gridinfo_' 的 undefined reference