我正在尝试编写一个包装器以将 gsl 库与 Fortran 一起使用。我设法让一个简单的包装器工作 - 来自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
函数
#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 代码做任何事情。有任何想法吗?