Fortran Coder

查看: 372|回复: 7

[求助] 求助各位老师解答Fortran可执行文件库依赖性相关问题

[复制链接]

8

帖子

2

主题

0

精华

入门

F 币
44 元
贡献
18 点
发表于 2023-12-26 00:51:16 | 显示全部楼层 |阅读模式
各位老师好,我是从事理论计算方面的学生。最近我在学习一个数值计算方面的Fortran程序时,有一个疑问一直困扰着我,恳请各位老师解答:

这个程序的主要内容是求解矩阵的本征值和本征矢,其中调用了MKL数学库中的DGEEV子程序,源代码附在下面;而作者给出的程序包中却只有exe可执行文件以及一个OpenMP并行相关的dll动态链接库。我的疑问是,既然这个程序中调用了MKL库中的一个函数,那么这个库应该以dll动态链接库的形式与程序包一起发布,但作者的程序包中没有这个库,但exe可执行文件仍然可以正常运行,这让我很想不通,恳请各位老师指点,谢谢!


作者发布的程序包内容

作者发布的程序包内容


sobeig.f90 (5.13 KB, 下载次数: 1)

1938

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1255 元
贡献
529 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2023-12-26 08:21:44 | 显示全部楼层
他用的静态链接。/MT
MKL的静态库代码被链接到exe里面了。
详解:http://dlllose.w.fcode.cn/

8

帖子

2

主题

0

精华

入门

F 币
44 元
贡献
18 点
 楼主| 发表于 2023-12-26 13:28:11 | 显示全部楼层
本帖最后由 Yjc 于 2023-12-26 13:31 编辑
fcode 发表于 2023-12-26 08:21
他用的静态链接。/MT
MKL的静态库代码被链接到exe里面了。
详解:http://dlllose.w.fcode.cn/

谢谢老师解惑;

想请老师判断下我的这个理解对不对,其实MKL数学库中的子程序就是lib库,在具体使用过程中,需要先将主程序编译成.o文件,再将这个主程序文件与所需要的lib静态库链接,就可以生成.exe可执行文件了呢?

这篇博文中调用MKL数学库的方法是不是就是运用了静态链接呢?https://blog.csdn.net/crazyhacking/article/details/7104309

谢谢老师解答!

1938

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1255 元
贡献
529 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2023-12-26 15:38:45 | 显示全部楼层
Yjc 发表于 2023-12-26 13:28
谢谢老师解惑;

想请老师判断下我的这个理解对不对,其实MKL数学库中的子程序就是lib库,在具体使用过程 ...

MKL中的子程序,是 Intel 编写的。不开源,所以你无法获得源代码。
Intel 提供了2种编译版本:

一种是DLL形式的,并提供导入库。
如果你链接这种导入库,编译产生的exe,就会依赖MKL的dll文件。

另一种是静态库形式的。
如果你链接这种静态库,编译产生的exe,就不会依赖MKL的dll文件。(但似乎不能取消对 OpenMP DLL 的依赖)

通常来说,/MD 链接方式会选择前者,而 /MT 链接方式会选择后者。

博文中看不出用的哪种,默认情况应该是用的前者。
这一问题,也不太影响对博文的理解。

8

帖子

2

主题

0

精华

入门

F 币
44 元
贡献
18 点
 楼主| 发表于 2023-12-26 18:01:26 | 显示全部楼层
本帖最后由 Yjc 于 2023-12-26 18:03 编辑

嗯嗯,我基本理解了,可以直接链接MKL中的静态库来编译产生不依赖于dll的exe可执行程序,链接的方式只需要将主程序和这个静态库一起编译成exe文件就可以了,感谢老师的解答!
您说的不能解除对OpenMP的依赖,我看开发者提供的程序包里面确实有libiomp5md.dll这个动态链接库,应该和您说的是一样的




8

帖子

2

主题

0

精华

入门

F 币
44 元
贡献
18 点
 楼主| 发表于 2023-12-26 21:24:24 | 显示全部楼层
fcode 发表于 2023-12-26 15:38
MKL中的子程序,是 Intel 编写的。不开源,所以你无法获得源代码。
Intel 提供了2种编译版本:

老师,我还有个问题想请教您,这个程序的可执行文件在运行时界面会显示一个控制台,允许用户向其中拖拽矩阵文件进行处理,并将本征值和本征矢写入新的文件中;

感觉这部分功能在源代码里没有体现诶,作者应该还有另外一部分实现这个控制台界面的代码,这种功能一般是怎么实现的呢?

非常感谢老师解答! 1.png

1938

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1255 元
贡献
529 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2023-12-27 08:43:21 | 显示全部楼层
拖拽功能是windows实现的。操作系统(windows/linux)实现了标准输入输出通道。
Fortran 的 Read 语句,在不特殊指定通道的情况下,会从标准输入通道获取输入内容。而 write 语句,会在标准输出通道输出内容。

在 windows 上,你把一个文件拖拽到命令行窗口,windows就会自动把这个文件的文件名输入到标准输入通道。

8

帖子

2

主题

0

精华

入门

F 币
44 元
贡献
18 点
 楼主| 发表于 2023-12-27 11:02:11 | 显示全部楼层
fcode 发表于 2023-12-27 08:43
拖拽功能是windows实现的。操作系统(windows/linux)实现了标准输入输出通道。
Fortran 的 Read 语句,在 ...

这里面的逻辑我大概理顺了,刚开始学编译型语言,很多概念都不太清楚;

谢谢老师解答!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-2-25 13:19

Powered by Tencent X3.4

© 2013-2024 Tencent

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