MinGW gcc と g95 を使って c から fortran のサブルーチンを呼び出す

やってみたらできたのでメモをしておく。c のソースコード main.c は

int main (void) {
  int i=3;
  hello_(&i);
}

これから呼び出している hello_() の fortran ソースコード hello.f は

      SUBROUTINE HELLO (i)
        PRINT * ,'HELLO' ,i
      END

コンパイルのコマンドは

g95 hello.f -shared -mrtd -o hello.dll
gcc main.c hello.dll

で、実行ファイル a.exe が出来上がった。

fortran から c の void 型関数(fortran の SUBROUTINE 相当)を呼び出す。(2010.7.14)

エントリポイントの fortran コード main.f は

      i=-999
      CALL hello(i)
      END

これから呼び出している hello() の c のコード hello.c は

#include <stdio.h>
void hello_ ( int * i )
{
  printf( "hello %d", *i );
}

コンパイルのコマンドは

gcc hello.c -shared -mrtd -o hello.dll
g95 main.f hello.dll

で、実行ファイル a.exe が出来上がった。
Cのソースの方にアンダースコアが必要な理由は理解していない。
参考にしたページ:dllの作り方 - MEMO:はてな支店