Fortran Coder

标题: lapack库 [打印本页]

作者: caimaxwell    时间: 2023-4-7 21:51
标题: lapack库
上次的问题未能得到完全的解决。我现在想调用lapack库中的zgetrf及zgetri函数,但是我下载的库解压后并没有.lib文件,导致无法链接。所以我要先编译lapack库,但是下载的库版本是.f格式的,我用的是.f90格式,在此情况下,请问要怎么做才能链接到lapack库呢?

作者: li913    时间: 2023-4-8 11:32
intel oneapi 里面有mkl库,mkl包含lapack。
作者: 楚香饭    时间: 2023-4-8 13:08
本帖最后由 楚香饭 于 2023-4-8 13:10 编辑

没有丝毫影响。

.f (固定格式)和 .f90(自由格式),不能在同一个源代码文件中混用。
但可以在多个源代码之间混用,即一部分源代码文件是固定格式,另一部分是自由格式。这是被允许的。

况且你还是把库编译成lib,

编译成 obj或lib 之后,使用上,都是一样的。
反之如果你想知道,编译前是 .f 还是 .f90,都非常困难(甚至不可能)。


PS:不要未经尝试或推断,就假象出使用上的限制。

作者: caimaxwell    时间: 2023-4-8 14:08
li913 发表于 2023-4-8 11:32
intel oneapi 里面有mkl库,mkl包含lapack。

十分感谢您的回答,但是有个疑惑,但是下载lapack库和下载intel oneapi有什么不同吗?intel oneapi在调用时更方便?
作者: caimaxwell    时间: 2023-4-8 14:38
楚香饭 发表于 2023-4-8 13:08
没有丝毫影响。

.f (固定格式)和 .f90(自由格式),不能在同一个源代码文件中混用。

感谢您的解答, 问题在于我在使用makefile文件时,编辑了
FC = "E:\CodeBlocks\MinGW\bin\gfortran"

OBJ = main.o  zgetrf2.o

FFLAGS = -O -fdefault-real-8 -mcmodel=large
#FFLAGS = -O

ecsie.x: $(OBJ)
        $(FC) $(FFLAGS) $(OBJ) -o ecsie.x

main.o: main.f90
   
zgetrf2.o: zgetrf2.f
报错gfortran.exe: error: inverse.o: No such file or directory
目录下是有main.f90文件的,为什么的能够得到zgetrf.o文件,得不到main.o文件呢?
作者: li913    时间: 2023-4-8 15:09
caimaxwell 发表于 2023-4-8 14:08
十分感谢您的回答,但是有个疑惑,但是下载lapack库和下载intel oneapi有什么不同吗?intel oneapi在调用 ...

mkl已经编译好了,可以直接使用,并且有优化,速度快。
作者: 楚香饭    时间: 2023-4-8 17:00
本帖最后由 楚香饭 于 2023-4-8 17:04 编辑
caimaxwell 发表于 2023-4-8 14:38
感谢您的解答, 问题在于我在使用makefile文件时,编辑了
FC = "E:\CodeBlocks\MinGW\bin\gfortran"

我也不知道为什么,你需要提供你的 main.f90 文件的内容,其他人才能判断原因。

此外,我建议你一步一个脚印的走。如果打算学习命令行的方式,那么就先用原生命令行。熟练之后,再学习makefile项目管理的方式。

你不妨先用
gfortran -c zgetrf2.f90
gfortran -c main.f90
gfortran main.o zgetrf2.o -o ecsie.x

来试试?这种一步一步的编译,可以让你清晰的明白哪个步骤发生了什么错误。

最后,zgetrf2.f90 应该是不能单独使用的,应该会依赖其他的函数。
我们通常的做法是把 lapack 整体先编译成 lib 文件,然后再整体使用。
(lib可以看作是一堆.o文件的集合。链接器会自动判断用到了哪些 .o 文件,并不会把全部lib链接到ecsie.x中)

像你这样,把lapack中自己所需的 .f 文件挑出来,也不是不行,但得挑很久,因为lapack的内部有复杂的依赖关系。


作者: caimaxwell    时间: 2023-4-8 17:22
楚香饭 发表于 2023-4-8 17:00
我也不知道为什么,你需要提供你的 main.f90 文件的内容,其他人才能判断原因。

此外,我建议你一步一个 ...

“通常的做法是把 lapack 整体先编译成 lib 文件,然后再整体使用”,就是这一步我卡了很久,我的目的就是得到lapack.lib文件,但是我不会操作
作者: 楚香饭    时间: 2023-4-8 17:38
caimaxwell 发表于 2023-4-8 17:22
“通常的做法是把 lapack 整体先编译成 lib 文件,然后再整体使用”,就是这一步我卡了很久,我的目的就 ...

你有Code::Blocks的话应该是非常简单的,创建一个lib库文件的工程,把所有 *.f 文件添加到工程,然后编译就好了。
作者: caimaxwell    时间: 2023-4-8 20:19
楚香饭 发表于 2023-4-8 17:38
你有Code::Blocks的话应该是非常简单的,创建一个lib库文件的工程,把所有 *.f 文件添加到工程,然后编译 ...

但是库里的文件是.f(fortran77)格式的,我创建的文件格式都是.f90(fortran90)文件的,把.f文件copy过来,格式不是兼容的,这个要怎么解决呢?
作者: 楚香饭    时间: 2023-4-9 09:14
caimaxwell 发表于 2023-4-8 20:19
但是库里的文件是.f(fortran77)格式的,我创建的文件格式都是.f90(fortran90)文件的,把.f文件copy过 ...

看3楼的回答




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2