2010-11-12 38 views
0

我在AIX上安装了gccgfortran,它们工作正常。除此之外,我将它们用于一些可通过头文件访问的库(C中的.h)。非常相同的库功能的模块(.mod在FORTRAN)使用,但你知道它们的使用是可选的:如果我从我的Fortran源代码中注释掉从c头创建mod文件

use mylib 
implicit none 

,一切工作正常。问题是,我不想注释掉implicit none,所以我必须保持use mylib太多,否则我会得到一堆

Error: Symbol 'foo' at (1) has no IMPLICIT type 

错误。而且,正如你知道的,.mod文件是编译器相关的,所以我不能用那些我有,否则gfortran会吐:

Fatal Error: File 'mylib.mod' opened at (1) is not a GFORTRAN module file 

理论上我可以重新编译所有与gfortran库,但最有可能它会由于各种原因失败(如果不是这样,它仍然是一项艰巨的任务)。

所以我想知道是否有一种方法来预编译.mod模块中的.h标题,只提供所需的接口信息。不幸的是,我无法找到关于此的任何信息。

+0

你知道这些库是用C还是fortran编写的吗?您可以通过检查C头文件来解决这个问题。我的猜测是这些库将用C语言编写,因为fortran库往往不兼容不同的供应商,并且你暗示你的代码链接没有问题。 – DaveP 2010-11-15 07:31:07

回答

2

C头文件不会生成Fortran模块文件。 Fortran模块文件依赖于编译器,但通常在编译包含模块的Fortran文件时生成。它们记录有关源代码模块的信息,例如它包含的过程及其调用约定,供编译器在遇到这些过程的调用时使用。这是编译器自动显式调用模块例程的方法。通常,在编译具有使用它的主程序或过程的文件之前,您必须编译包含模块的Fortran源代码文件(此处为模块“mylib”)。你为什么认为用gfortran编译这些库很可能会失败,或者会令人望而生畏?我建议试试看。您无法将C .h文件编译到模块中。如果Fortran库的作者希望他们能够提供一个带有Fortran接口的文件,这些接口描述了这些过程并且可以将其编译为模块。但是这种技术容易出错,因为这意味着有两件事必须保持一致。

如果这些库位于C中,并且正在通过ISO C绑定从Fortran中调用,那么最好的方法是编写带有接口的文件。提供了这样一个Fortran文件吗?是不是来自不正确的模块文件?当你用gfortran编译这个文件时,你会得到.mod文件。虽然实际的C源代码和Fortran接口声明之间的重复意味着必须维护两个项目,在这种情况下,由于原始源代码采用C语言并且Fortran接口语句将Fortran编译器的C例程描述为Fortran语言。

+0

问题中的库非常大,而XL(非GNU)特定。如果您曾尝试编译任何针对IBM的XL Compute与GNU(或反之)的设计,您会知道为什么我认为这是令人生畏或不可能的。我甚至不确定我可以访问相关的源代码.... – Davide 2010-11-14 04:05:37

1

你可以宣布你从模块在一个特制的文件mylib.fh使用作为external的功能/子程序,例如:

#mylib.fh 
external my_function 

在你Fortran代码,那么您需要使用:

implicit none 
include 'mylib.fh' 
+0

是的,这是一个很好的建议。但是我可以在“如何从现有的mylib.h中自动创建这样的mylib.fh - 而不用编写我自己的解析器(我可以编写)?”这个问题来重新解释这个问题。 – Davide 2010-11-15 15:33:18

+0

嗯,我不知道这样的方式。如果在fortran中将C函数作为子例程调用,那么根本不需要任何头文件,所以我假设您将fortran中的函数作为函数调用?你可以举一个例子:(i)C头文件中的函数声明,(ii)你的fortran程序中的相应调用。如果C库不打算被Fortran调用,那么你可能不得不重写接口,例如使用Fortran 77,这并不总是奏效。 – steabert 2010-11-15 16:34:23