我正在开发一个包含许多不同功能的Fortran库。为了更好地开发和维护它,我将这个库分成几个模块(例如part1.f90
,part2.f90
,part3.f90
)和一个主模块mylib.f90
使用所有这些个别模块:
module mylib
use part1
use part2
use part3
implicit none
end module mylib
然后我的想法是在use mylib
的程序中使用这个主模块。但是我在编译和链接这些模块时遇到了麻烦。
模块全部包含在目录/mylib/src/
中并编译,因此它还包含相应的*.o
和*.mod
文件。当我使用:
gfortran -I/mylib/src myprog.f90 -o myprog
我希望编译器能够在指定的目录中找到所需的模块。但遗憾的是,我收到一条错误消息,指出对子模块中实际包含的函数有未定义的引用。
我在这里做错了什么?
感谢您的帮助!
答案 0 :(得分:2)
我认为您省略了要找到模块功能的可执行表示( etc )的目标文件的链接。使用-I
选项,您告诉编译器在哪里可以找到包含文件(即 .mod
文件),但您无法告诉它链接{{1}我猜想,你已经创建过的文件。链接它们的一种简单方法是按以下方式编辑编译命令:
.o
我希望如果我使用命令行进行编译(我不使用gfortran -I/mylib/src -o myprog myprog.f90 /mylib/src/part1.o /mylib/src/part2.o ...
或其他一些构建系统)我会知道如何指定make
的路径文件只有一次。有人可能迟早会来到这里,把我们都放在那张特定的图片中,或者你可以闯入文档。
答案 1 :(得分:0)
我从其他网站上找到了一些信息,例如: http://fortranwiki.org/fortran/show/Library+distribution
第一种方法是编译模块,将*.mod
文件保存在特定目录中,例如/usr/lib/fortran
,并使用libmylib.a
创建包含*.o
个文件的存档ar -r libmylib.a *.o
。然后,为了编译我的程序,我将添加标志-I/usr/lib/fortran
以指示编译器所在的编译器,以便他在我的代码中遇到use mylib
时可以找到它们。最后,我会使用标记-lmylib
将我的程序链接到已归档的库,并使用-L
指示归档库的位置。
这种方法的问题是Fortran编译的模块依赖于编译器,这意味着如果在机器上使用不同的编译器甚至不同版本的同一编译器,我们必须要小心。
第二种方法是将库的模块包含在构建目录中,并与程序一起编译。
欢迎任何其他建议!