2013-04-30 122 views
0

我正在使用包含许多不同功能的Fortran库。要发展它,更容易维护它,我已经分成这个库分为几个模块(例如,part1.f90part2.f90part3.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 

我期望编译器在指定的目录中找到所需的模块。但不幸的是,我收到一条错误消息,说明有实际包含在子模块中的函数存在未定义的引用。

我在这里做错了什么?

谢谢你的帮助!

回答

2

我认为您正在省略可找到模块功能的可执行表示()的目标文件的链接。使用-I选项,您告诉编译器在哪里可以找到包含文件(.mod文件),但是您无法告诉它链接您已拥有的.o文件,我认为这些文件已经创建。将它们连接一个简单的方法是大意如下编辑编译命令:

gfortran -I/mylib/src -o myprog myprog.f90 /mylib/src/part1.o /mylib/src/part2.o ... 

我想到,如果我用命令行编译(我不知道,我用make或其他一些构建系统)我知道如何只指定一次到.o文件的路径。有人可能迟早会来这里,把我们都放在这张特定的照片中,或者你可以闯入文档。

+0

谢谢您的回复!然而,当我将程序与库链接时,我试图绕过提及所有对象的需要。 – remek 2013-05-01 14:54:31

0

我发现从其他网站的一些信息,例如参见: http://fortranwiki.org/fortran/show/Library+distribution

第一种方法将编译的模块,该*.mod文件保存在一个特定的目录,例如/usr/lib/fortran,并使用ar -r libmylib.a *.o创建包含*.o文件的档案libmylib.a。然后,为了编译我的程序,我将添加标记-I/usr/lib/fortran以指示编译器位于哪个模块,以便在我的代码中遇到use mylib时可以找到它们。最后,我会使用标记-lmylib将我的程序与归档库链接,并指示归档库位于-L的位置。

这种方法的问题是Fortran编译模块是依赖于编译器的,这意味着如果在一台机器上使用不同的编译器甚至不同版本的相同编译器,我们必须小心。

第二种方法将包括库中的模块在build目录中,并与程序一起编译它们。

欢迎任何其他建议!