zhoufcumt的个人博客分享 http://blog.sciencenet.cn/u/zhoufcumt

博文

Linux下 Fortran 90 不同目录的modules和主程序的编译链接

已有 14588 次阅读 2013-10-11 07:59 |个人分类:Fortran|系统分类:科研笔记| Fortran, 编译, module, 主程序, 不同目录

 昨天在Linux下编译fortran90的modules的时候出现问题,比如我在main目录下有mod和src两个目录,mod目录下test1.f90 这个module,src目录下有test2.f90这个module,当然多个modules也类似(下面的过程就需要写makefile来实现,更方便快捷),src有个test_src目录,里面有test.f90主程序,正确编译链接除了要加 use xx (xx是module名)。刚开始我的编译链接流程是这样的:

1. 进入mod目录: ifort -free -c test1.f90,ar rv libtest1.a test1.o

2. 进入src目录:ifort -free -I../mod/ -c test2.f90,ar rv libtest2.a test2.o (test2要用到test1 module)

前两步除了生成库文件,object文件(.o),还会生成 .mod文件。

3. 进入test_src目录:ifort -free test_src.f90 -I../ -I../../mod/ -o test_src (-I带相对路径是指定 .mod所在目录)

这样的编译结果提示 "undefined reference to......"

     网上的解决方案有个是把.mod拷贝到和主程序一个目录,其实和我的做法是一样的,就是确定好路径而已。

     当用ifort -free test_src.f90 ../libtest2.a ../../mod/libtest1.a -o test_src,提示  "Error in opening the compiled

module file, check INCLUDE paths"

    最后的解决方案是:ifort -free test_src.f90  ../libtest2.a ../../mod/libtest1.a  -I../  -I../../mod/ -o test_src,既要指定.mod所在的目录,又要指定对应的静态库,刚开始理解上有个误区,以为有了.mod就不用静态库了,其实不然,mod目录下的modules还要生成静态库,而且主程序链接生成可执行模块的时候还需要这个静态库。

NOTE: -I../  -I../../mod/ 这两个的顺序可以互换,但是  ../libtest2.a ../../mod/libtest1.a不能互换,否则出错,因为libtest2.a依赖于libtest1.a。



https://blog.sciencenet.cn/blog-350278-731906.html

上一篇:Python版Rinex观测数据、精密轨道数据下载包PyRnxOrb
下一篇:RINEX3转换成RINEX2文件(已更新下载地址)
收藏 IP: 222.66.117.*| 热度|

2 王振亭 董雨欣

该博文允许注册用户评论 请点击登录 评论 (2 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-28 13:42

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部