Fortran で gsl ライブラリを使用するためのラッパーを作成しようとしています。シンプルなラッパーを動作させることができました - http://www.helsinki.fi/~fyl_tlpk/luento/ohj-13-GSL-e.htmlの例
Fortran コード
program gsltest
implicit none
real(kind=selected_real_kind(12)) :: a = 0.11, res
external :: glsgateway
call gslgateway(a,res)
write(*,*) 'x', a, 'atanh(x)', res
end program gsltest
c 関数
#include <gsl/gsl_math.h>
void gslgateway_(double *x, double *res){
*res = gsl_atanh(*x);
}
それはすべて順調です。ただし、より複雑なラッパーに問題があります。http://apwillis.staff.shef.ac.uk/aco/freesoftware.htmlの例から次のコードを変更しました。
c ラッパー (rng_initialise.c)
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
static gsl_rng* r;
void rng_initialise__(int* s) {
r = gsl_rng_alloc(gsl_rng_taus);
gsl_rng_set(r, (unsigned long int)(*s));
}
Fortran メイン (main.f90)
PROGRAM main
integer seed
call system_clock(seed)
WRITE (*,*) 'calling rng_initialise'
call rng_initialise(seed)
END PROGRAM main
次に、コンパイルしてリンクします
gcc -c rng_initialise.c
g95 -c main.f90
g95 -o main main.o rng_initialise.o -L/usr/libs -lgsl
このプログラムを実行すると、出力が得られません。ただし、rng_initialise 内の行をコメントアウトすると、
...
void rng_initialise__(int* s) {
// r = gsl_rng_alloc(gsl_rng_taus);
// gsl_rng_set(r, (unsigned long int)(*s));
}
次に、Fortran コードから出力を取得します (「calling_rng_initialise」を STDOUT に書き込みます)。
したがって、問題は gsl_rng_alloc と gsl_rng_set の呼び出しにあるようです。しかし、エラー メッセージは表示されず、Fortran コードが何も実行できない理由がわかりません。何か案は?