重复从Fortran调用C函数时出现分段错误

我有一个Fortran 90程序,它反复调用C函数。 第一次使用该函数一切顺利,但第二次代码尝试访问该函数时,它会出现以下错误:

程序接收信号SIGSEGV:分段故障 – 无效的存储器参考。

我在Windows上使用gfortran v.4.6,链接到我没有源代码的库。 该库作为DLL来到我身边,我使用gendef和dlltool来创建一个链接到的.a库。

代码如下:

PROGRAM cmod USE, INTRINSIC :: ISO_C_BINDING INTERFACE LOGICAL (C_BOOL) FUNCTION clover(scen,reg,soil,top,rain,depth,numd,nums,numb, numd,addn,srate,stype,nloss,ploss,ErrStr) BIND (C, name = "ClOvr") USE, INTRINSIC :: ISO_C_BINDING INTEGER (C_INT), INTENT(IN), VALUE :: scen,reg,soil,topo,depth REAL (C_DOUBLE), INTENT(IN), VALUE :: rain,numd,nums,numb,numd REAL (C_DOUBLE), INTENT(IN), VALUE :: addn,srate INTEGER (C_INT), INTENT(IN), VALUE :: stype REAL (C_DOUBLE), INTENT(OUT) :: nloss,ploss CHARACTER(C_CHAR), INTENT(OUT) :: ErrStr(*) END FUNCTION clover END INTERFACE ..... do ..... result = clover(a,b,c, d, e, f, g, h, sb, sd, an, sr, st,lossx,lossy,err) ...... result = clover(a,b,c, d, e, f, g, h, sb, sd, an, sr, st,lossx,lossy,err) end do END PROGRAM cmod 

我没有C代码,但我从IBM Fortran移植。

接口声明包含这两行

 !DEC$ ATTRIBUTES VALUE :: scen,reg,soil,top,rain,depth,numd,nums,numb,numd,addn,srate,stype !DEC$ ATTRIBUTES REFERENCE :: lossx,lossy,ErrStr 

IBM fortran使用以下代码加载库并访问该函数:

 pointer (q,clover) p = loadlibrary("clover.dll") q = getprocaddress(p, "ClOvr") 

所以我可能会在GNU fortran的翻译中遗漏一些东西

我发现了我的问题:当我编译时,我必须使用-mrtd (sdtcall)