Fortran Coder

查看: 3070|回复: 10

[数学库] lapack库

[复制链接]

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
发表于 2023-4-7 21:51:01 | 显示全部楼层 |阅读模式
上次的问题未能得到完全的解决。我现在想调用lapack库中的zgetrf及zgetri函数,但是我下载的库解压后并没有.lib文件,导致无法链接。所以我要先编译lapack库,但是下载的库版本是.f格式的,我用的是.f90格式,在此情况下,请问要怎么做才能链接到lapack库呢?

796

帖子

2

主题

0

精华

大宗师

F 币
3787 元
贡献
2266 点
发表于 2023-4-8 11:32:33 | 显示全部楼层
intel oneapi 里面有mkl库,mkl包含lapack。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

发表于 2023-4-8 13:08:16 | 显示全部楼层
本帖最后由 楚香饭 于 2023-4-8 13:10 编辑

没有丝毫影响。

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

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

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


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

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
 楼主| 发表于 2023-4-8 14:08:57 | 显示全部楼层
li913 发表于 2023-4-8 11:32
intel oneapi 里面有mkl库,mkl包含lapack。

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

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
 楼主| 发表于 2023-4-8 14:38:50 | 显示全部楼层
楚香饭 发表于 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文件呢?

796

帖子

2

主题

0

精华

大宗师

F 币
3787 元
贡献
2266 点
发表于 2023-4-8 15:09:28 | 显示全部楼层
caimaxwell 发表于 2023-4-8 14:08
十分感谢您的回答,但是有个疑惑,但是下载lapack库和下载intel oneapi有什么不同吗?intel oneapi在调用 ...

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

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

发表于 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的内部有复杂的依赖关系。

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
 楼主| 发表于 2023-4-8 17:22:52 | 显示全部楼层
楚香饭 发表于 2023-4-8 17:00
我也不知道为什么,你需要提供你的 main.f90 文件的内容,其他人才能判断原因。

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

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

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

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

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

48

帖子

15

主题

0

精华

熟手

F 币
179 元
贡献
104 点
 楼主| 发表于 2023-4-8 20:19:29 | 显示全部楼层
楚香饭 发表于 2023-4-8 17:38
你有Code::Blocks的话应该是非常简单的,创建一个lib库文件的工程,把所有 *.f 文件添加到工程,然后编译 ...

但是库里的文件是.f(fortran77)格式的,我创建的文件格式都是.f90(fortran90)文件的,把.f文件copy过来,格式不是兼容的,这个要怎么解决呢?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-23 16:48

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表