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

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

我在这里做错了什么?

谢谢您的帮助!

4

2 回答 2

3

我认为您忽略了要在其中找到模块函数()的可执行表示的目标文件的链接。使用该-I选项,您告诉编译器在哪里可以找到包含文件(文件) ,.mod但您没有告诉编译器链接.o您拥有的文件,我想,已经创建了。链接它们的一种简单方法是按照以下行编辑您的编译命令:

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

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

于 2013-04-30T18:25:02.910 回答
0

我从其他网站上找到了一些信息,例如: http: //fortranwiki.org/fortran/show/Library+distribution

第一种方法是编译模块,将文件保存*.mod在特定目录中,例如/usr/lib/fortran,然后使用. 然后,为了编译我的程序,我会添加标志来指示编译器模块所在的位置,以便他在我的代码中遇到 a 时可以找到它们。最后,我将使用标志将我的程序与存档库链接,并用 . 指示存档库的位置。libmylib.a*.oar -r libmylib.a *.o-I/usr/lib/fortranuse mylib-lmylib-L

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

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

欢迎任何其他建议!

于 2013-05-01T15:29:29.540 回答