Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 来自Fortran模块的静态库_Module_Fortran - Fatal编程技术网

Module 来自Fortran模块的静态库

Module 来自Fortran模块的静态库,module,fortran,Module,Fortran,我不是一个非常专业的Fortran程序员,但现在我已经编写了许多子例程(用Fortran 90),我必须将它们放在模块中(由其他子例程和程序中的“use”语句使用),以避免编写接口。我必须用F77编写的旧代码来使用这些模块。 我不希望编译器一次又一次地编译这些模块。因此,在编译这些模块后,我从“.o”文件创建了一个静态库: ar rc libmymath.a module1.o module2.o module3.o 但是,我仍然需要保留这些模块的“.mod”文件,以便能够在代码中“使用”它们

我不是一个非常专业的Fortran程序员,但现在我已经编写了许多子例程(用Fortran 90),我必须将它们放在模块中(由其他子例程和程序中的“use”语句使用),以避免编写接口。我必须用F77编写的旧代码来使用这些模块。 我不希望编译器一次又一次地编译这些模块。因此,在编译这些模块后,我从“.o”文件创建了一个静态库:

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文件是二进制文件。