|||
昨天在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。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-28 13:42
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社