Module 来自Fortran模块的静态库
我不是一个非常专业的Fortran程序员,但现在我已经编写了许多子例程(用Fortran 90),我必须将它们放在模块中(由其他子例程和程序中的“use”语句使用),以避免编写接口。我必须用F77编写的旧代码来使用这些模块。 我不希望编译器一次又一次地编译这些模块。因此,在编译这些模块后,我从“.o”文件创建了一个静态库:Module 来自Fortran模块的静态库,module,fortran,Module,Fortran,我不是一个非常专业的Fortran程序员,但现在我已经编写了许多子例程(用Fortran 90),我必须将它们放在模块中(由其他子例程和程序中的“use”语句使用),以避免编写接口。我必须用F77编写的旧代码来使用这些模块。 我不希望编译器一次又一次地编译这些模块。因此,在编译这些模块后,我从“.o”文件创建了一个静态库: ar rc libmymath.a module1.o module2.o module3.o 但是,我仍然需要保留这些模块的“.mod”文件,以便能够在代码中“使用”它们
ar rc libmymath.a module1.o module2.o module3.o
但是,我仍然需要保留这些模块的“.mod”文件,以便能够在代码中“使用”它们
我的问题:是否可以将这些“.mod”文件打包到静态库归档文件“.a”(就像我们对.o文件所做的那样)中,以便将所有内容封装到单个文件静态库中
注:我指的是在我的系统中的任何地方,它们都使用gfortran 64位。不,这是不可能的 类似于C/C++,
.mod
文件类似于头文件。它描述了模块的内容,使用
类似于#包含
这些mod文件是特定于编译器(通常甚至是版本)的,并且是必需的,因为模块名称会损坏函数,因此需要一个查找表来查找结果函数名。您只需将这些
.mod文件
复制到您的fortran finclude目录
e、 g我正在使用ubuntu
和gcc-4.4.3
。我所做的是将库librandom.a
复制到/usr/local/lib
,并将mod文件random.mod
复制到/usr/lib/gcc/i486 linux gnu/finclude
现在我不必一次又一次地创建那些mod。我只需要使用gfortran-o myfile myfile.f90-lrandom
来编译我的程序并与库链接。当然,我必须在myfile.f90中使用“use random”
干杯一个简单的方法是使用
gfortran myprog.f90-I/path/to/mod_files-L/path/to/lib-lmylib
其中module.mod
位于目录/path/to/mod_文件中。module.o
是由
gfortran-c/path/to/mod_files/module.f90
库mylib.a
由
ar rcv/path/to/lib/mylib.a/path/to/mod_files/module.o
但是你仍然需要保留.mod文件
我也有同样的问题
希望我帮了忙。非常感谢。这个类比对于理解Fortran中使用“.mod”文件的方式非常有帮助。有什么简单的方法来处理这些“.mod”文件吗?我有许多模块,每个模块都包含许多函数和用于特定计算的子程序。因此,通过增加每个模块的子例程/函数的数量来减少模块的数量是不可取的。如何处理它们实际上取决于构建系统。我们使用CMake并让它将所有mod文件安装到include目录中,就像您安装头文件一样。因此,我们的代码安装到/bin
、/lib
和/include
目录结构中。但除此之外,这就像处理一堆头文件和组织由您决定,您如何实现组织取决于您的构建系统!我用gfortran
编译的模块构建了这个库。我将这些库发送给一位拥有AMD Open64(OpenF90)编译器的同事。因此,当他试图使用OpenF90在代码中使用这个静态库时,他遇到了一个错误,即缺少.mod
文件(Open64使用大写字母来命名.mod
文件)。有没有方法告诉Open64这些.mod
文件的名称是用小写字母写的?不幸的是,.mod
文件通常与其他编译器不兼容。事实上,它们甚至与同一编译器的不同版本都不兼容。当您需要查看多个编译器时,与头文件的类比就不一样了。因为编译器命名mangle的方式不是Fortran标准的一部分,所以.mod
文件的格式也没有标准化。事实上,gfortran mod文件是纯文本,而ifort(英特尔)mod文件是二进制文件。