无法在生成文件中使用 LAPACK



我有一个程序(在fortran中),我使用了三个自定义模块,它们利用了LAPACK。到目前为止,我已经使用以下shell脚本编译了我的程序:

filestring="main"
gfortran -c mod_exp.f90 mod_genmat.f90 mod_print.f90 $filestring.f90
gfortran mod_exp.o mod_genmat.o mod_print.o $filestring.o -llapack -lblas
rm mod_exp.o mod_genmat.o mod_print.o $filestring.o exponentiate.mod genmat.mod printing.mod printing_subrtns.mod
mv a.out $filestring

因为我一直在使用越来越多的模块和不同的程序使用它们,我决定开始使用makefiles。在一个教程之后,我设法写了下面的代码:

FC = gfortran
FFLAGS = -Wall -Wextra -llapack -lblas #-fopenmp
SOURCES = mod_print.f90 mod_genmat.f90 mod_exp.f90 main.f90
OBJ = ${SOURCES:.f90=.o} #substitute .f90 with .o

%.o : %.f90 #creation of all *.o files DEPENDS on *.f90
$(FC) $(FFLAGS) -c -O $< -o $@

main: $(OBJ)
$(FC) $(FFLAGS) -o $@ $(OBJ)
clean:
@rm -f *.o *.mod main

然而,当执行make时,它说LAPACK函数不被识别。其中一个错误如下:

/usr/bin/ld: mod_exp.o: in function `__exponentiate_MOD_diagun':
mod_exp.f90:(.text+0x37f): undefined reference to `zgees_'
...
collect2: error: ld returned 1 exit status

我看到的一个可能的错误是,我需要指定库的位置。然而,这似乎很奇怪,因为我以前不需要这样做;我也不知道怎么找到它。

请显示导致错误产生的链接命令。

我相信,如果您将该命令行剪切并粘贴到shell提示符中,您将得到与make运行时相同的错误。所以问题不在于make,而在于你的link命令。

问题是你把库放在了链接行对象的前面。库应该放在对象之后的最后,否则当链接器检查库时,它不知道需要包含哪些符号(因为还没有解析对象来查看缺少哪些符号)。

这就是为什么LDLIBS传统上是一个单独的变量:

FC = gfortran
FFLAGS = -Wall -Wextra #-fopenmp
LDLIBS = -llapack -lblas
SOURCES = mod_print.f90 mod_genmat.f90 mod_exp.f90 main.f90
OBJ = ${SOURCES:.f90=.o} #substitute .f90 with .o
%.o : %.f90 #creation of all *.o files DEPENDS on *.f90
$(FC) $(FFLAGS) -c -O $< -o $@
main: $(OBJ)
$(FC) $(FFLAGS) -o $@ $(OBJ) $(LDLIBS)

相关内容

  • 没有找到相关文章

最新更新