caimaxwell 发表于 2023-4-7 21:51:01

lapack库

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

li913 发表于 2023-4-8 11:32:33

intel oneapi 里面有mkl库,mkl包含lapack。

楚香饭 发表于 2023-4-8 13:08:16

本帖最后由 楚香饭 于 2023-4-8 13:10 编辑

没有丝毫影响。

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

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

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


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

caimaxwell 发表于 2023-4-8 14:08:57

li913 发表于 2023-4-8 11:32
intel oneapi 里面有mkl库,mkl包含lapack。

十分感谢您的回答,但是有个疑惑,但是下载lapack库和下载intel oneapi有什么不同吗?intel oneapi在调用时更方便?

caimaxwell 发表于 2023-4-8 14:38:50

楚香饭 发表于 2023-4-8 13:08
没有丝毫影响。

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


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

OBJ = main.ozgetrf2.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:28

caimaxwell 发表于 2023-4-8 14:08
十分感谢您的回答,但是有个疑惑,但是下载lapack库和下载intel oneapi有什么不同吗?intel oneapi在调用 ...

mkl已经编译好了,可以直接使用,并且有优化,速度快。

楚香饭 发表于 2023-4-8 17:00:42

本帖最后由 楚香饭 于 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:52

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

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

“通常的做法是把 lapack 整体先编译成 lib 文件,然后再整体使用”,就是这一步我卡了很久,我的目的就是得到lapack.lib文件,但是我不会操作

楚香饭 发表于 2023-4-8 17:38:12

caimaxwell 发表于 2023-4-8 17:22
“通常的做法是把 lapack 整体先编译成 lib 文件,然后再整体使用”,就是这一步我卡了很久,我的目的就 ...

你有Code::Blocks的话应该是非常简单的,创建一个lib库文件的工程,把所有 *.f 文件添加到工程,然后编译就好了。

caimaxwell 发表于 2023-4-8 20:19:29

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

但是库里的文件是.f(fortran77)格式的,我创建的文件格式都是.f90(fortran90)文件的,把.f文件copy过来,格式不是兼容的,这个要怎么解决呢?
页: [1] 2
查看完整版本: lapack库