我使用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
中的类型定义?
答案 0 :(得分:2)
C和Fortran是不同的语言。虽然Fortran编译器通常支持 C调用约定,但这意味着您可以从fortran调用C函数,反之亦然。这并不意味着类型信息是从相同的语法解析的。
换句话说:C头是C头,而不是fortran类型定义。
C只能构建Fortran不能拥有的类型,而Fortran具有C不具备的类型。因此,这些世界之间没有直接的翻译。如果你的C函数采用的类型在fortran中没有直接的等价物,那么你的时间就会很短。
所以:不,除非你写了一些包装代码,否则这不行。有自动包装器生成器,但它们的复杂性imho在您描述的用例中没有意义。说真的,如果可以,请避免像SWIG这样的事情。