我有一个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的翻译中遗漏了一些东西
答案 0 :(得分:0)
我发现了我的问题:编译时,我必须使用-mrtd (sdtcall)