Fortran Coder

新手在VS及MinGW中调用arpack数值计算库遇到的问题

查看数: 18639 | 评论数: 11 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-3-30 15:00

正文摘要:

大家好,我刚刚接触fortran这门语言。想要学习一些数值软件库的写法、用法,日后可以自己编写一些算法。现在在第一次尝试调用arpack库时出现了一个问题,想要向论坛求助! 我用的是VS2015,同时安装了intel parallel ...

回复

cstg 发表于 2017-3-31 18:58:34
vvt 发表于 2017-3-31 17:56
C语言的特性是需要函数原型(它是 h 头文件的主要内容)
而fortran的语言特性,不需要函数原型。所以 fortr ...

非常感谢您的耐心解答与所给出的资料,感觉明白了不少。还遗留下的一些疑问我先从您给的资料中来找答案吧,可能看了更多的资料后这些问题就解决了。

再次感谢!
vvt 发表于 2017-3-31 17:56:49
本帖最后由 vvt 于 2017-3-31 17:59 编辑

C语言的特性是需要函数原型(它是 h 头文件的主要内容)
而fortran的语言特性,不需要函数原型。所以 fortran 里很少用到头文件。

在C语言和fortran语言中,include都是会被替换的(详见 http://fpp.w.fcode.cn),C语言是为了获得函数原型,而fortran则必要性并不强。(具体看包含文件的内容,有些函数库需要include一个头文件,出于各种目的)

我对arpack也不了解。找不到 _DGEMM 可能是 lib 配置不合适。你再自己看看吧。

不管是命令行还是VS,都可以有效的管理项目。它们的形式不同,但不存在说“必须用命令行”或“必须用VS”。(实质上,VS只是对命令行进行了界面化的包装)

是的,lib文件其实就是 .o 文件的集合。你这样理解是对的。命令行下使用 lib 文件,资料应该有不少,比如本论坛的视频教程 http://v.fcode.cn 应用篇第4期。

推荐阅读资料《程序员的自我修养——链接、装载与库》
cstg 发表于 2017-3-31 15:07:21
vvt 发表于 2017-3-31 07:44
你不能在自由格式源代码“.f90”中 include 固定格式的源代码“.f”通常的约定:
函数库里的源代码文件,编 ...

啊啊,你说的好有道理!我在取消了include后用MinGW就编译并且链接成功了!非常感谢!

其实不同格式的先编成目标文件后再链接成一个可执行文件这件事我最近在学习时也看到过,但用起来时原理就忘了。。。
不过我还是有些疑问的地方,1.比如在C程中我一直持有的观点是如果要用到其他文件中定义的函数的话,一定要include那个文件后才能编译成功,因为预编译过程中要先把include的部分给替换掉成所调用的函数文件。但这里却不需要使用include,而我现在是使用MinGW编译的,就是说似乎没有利用到lib文件,这让我很想不通,是fortran的特性吗?
2. 虽然这里用MinGW编译成功了,但是在VS中还是失败,错误显示是链接中出现的问题:        error LNK2019: 无法解析的外部符号 _DGEMM,该符号在函数 _MAIN__ 中被引用 arpack_test_main.obj               
这是不是意味着我配置arpack的lib的过程有误?可是我确实是严格安装博客上的过程做的。。唯一一个让我感觉不踏实的地方在于博客上要求使用Visual Studio命令提示,我VS2015没找到对应名字,于是就使用了“VS2015开发人员命令提示符”去操作,这个是做对的吗?
3. 我对lib的理解还很粗浅。我的理解是这样的:比如我现在成功编译其实并没有使用lib文件,我其实是直接拿源文件过来编译链接的,但这样可能要同时链接很多程序(比如这次我除了链接dgemm.o外还链接了dgemm.f中所使用的另外两个文件),这样对大型工程就没办法做了,所以整合成一个lib文件,只要通过某种方式include了lib文件,那么至少在IDE下通过一定的设置就可以直接调用和链接那些文件了。我这样的理解对吗?如果对的话,在非IDE下改如何使用lib文件呢,比如用MinGW?我对编译器的使用方面非常小白,如果有什么推荐去阅读的资料就太好了!
非常感谢!
vvt 发表于 2017-3-31 07:44:58
本帖最后由 vvt 于 2017-3-31 07:47 编辑

你不能在自由格式源代码“.f90”中 include 固定格式的源代码“.f”通常的约定:
函数库里的源代码文件,编译成目标文件,与您书写的源代码文件编译成的目标文件共同链接。
函数库里的头文件,被您书写的源代码文件 include。(这个头文件可能有,可能没有)

实际上,我认为你的 include 语句完全是多余的。
cstg 发表于 2017-3-30 23:07:34
另外我也试过在VS中用固定格式写的更简单的(但调用了dgemm.f)程序。。。还是出错。。
Jackdaw 发表于 2017-3-30 21:50:37
cstg 发表于 2017-3-30 20:35
哦哦!谢谢!!!确实写错了。不过我现在改过来后还是照常出错。更重要的是我直接在VS中编译dgemm.f也出 ...

那就接着改吧,我看那个程序参数说明里面很清楚,读懂后修改即可
cstg 发表于 2017-3-30 20:39:19
pasuka 发表于 2017-3-30 17:55
1、IVF自带的FEAST为啥不试一试?大部分情况下,性能持平或者超过ARPACK;
2、非要ARPACK的话,请去下载这 ...

我对于FEAST、armadi并不了解,我也是新学。你说的版本以及例子我会去试一下,太感谢了!不过我觉得我应该还是在哪里犯了个低级错误,很想知道是在哪里。
cstg 发表于 2017-3-30 20:35:58
Jackdaw 发表于 2017-3-30 18:18
DGEMM是一个subroutine,不是function,你写的调用方式错了

哦哦!谢谢!!!确实写错了。不过我现在改过来后还是照常出错。更重要的是我直接在VS中编译dgemm.f也出错,而用MinGW直接编译则正常(虽然编译exmain时还是出错了),这让我没有想通。

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

GMT+8, 2024-5-15 00:33

Powered by Tencent X3.4

© 2013-2024 Tencent

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