使用Fortran中C头中定义的类型

时间:2018-01-18 22:56:35

标签: makefile compilation fortran

我使用64位机器运行RHEL 6.7和gfortran 4.4.7。

我正在尝试从代码库中构建一个静态库,看起来像这样

└── root
    ├── C_src
    │   └── foo.h
    ├── Fortran_src
        |──Makefile
        |── <other files>
        └── foo.f90

我的Makefile只列出了所有*.f90个文件,并从中制作了.o个文件。

尝试使用命令

构建foo.f90
gfortran -c -I. foo.f90 -o

我收到以下错误

TYPE (MY_TYPE), INTENT (OUT) :: PassesOutput 
       1
Error: derived type 'mytype' at (1) is being used before it is defined

然而,经过一些挖掘后,我发现这种类型正在foo.h

中定义
typedef struct{
    <bunch of stuff>
} MY_TYPE

有没有办法构建此代码,以便fortran在尝试编译foo.h时能够了解foo.f90中的类型定义?

1 个答案:

答案 0 :(得分:2)

C和Fortran是不同的语言。虽然Fortran编译器通常支持 C调用约定,但这意味着您可以从fortran调用C函数,反之亦然。这并不意味着类型信息是从相同的语法解析的。

换句话说:C头是C头,而不是fortran类型定义。

C只能构建Fortran不能拥有的类型,而Fortran具有C不具备的类型。因此,这些世界之间没有直接的翻译。如果你的C函数采用的类型在fortran中没有直接的等价物,那么你的时间就会很短。

所以:不,除非你写了一些包装代码,否则这不行。有自动包装器生成器,但它们的复杂性imho在您描述的用例中没有意义。说真的,如果可以,请避免像SWIG这样的事情。