导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2018/9/20 14:42:54
标题:
Delphi如何调用GFortran生产的动态库dll文件?
浏览:1130
加入我的收藏
楼主:
开发环境用CodeBlocks 17.12, Fortran编译是缺省自带的GFortran,简单测试两个数x,y相加返回z的dll,Project名字为“add_dll”: subroutine my_add(x,y,z) z = x+y end 编译得到了“add.dll.dll”文件。 Delphi 7调用: procedure my_add(x,y: Double;var z: double); StdCall; External 'add_dll.dll'; 按钮执行代码: procedure TForm1.Button1Click(Sender: TObject); var x, y, z: double; begin x := StrToFloat(Edit3.text); y := StrToFloat(Edit4.text); my_add(x,y,z); end; Delphi编译没问题,已执行就出“无法定位程序输入点my_dll于动态链接库add_dll.dll上”。烦请有知道的告知下原因?该如何调用? 多谢了。
----------------------------------------------
-
作者:
2018/9/20 15:39:01
1楼:
dll 输入点 的名字,都是字符串,即便是 记事本都可以查看。 DELPHI 调用 DLL 都是 WINAPI,这个提示,明显就是微软提示的。 不满意?找微软。
----------------------------------------------
(C)(P)Flying Wang
作者:
2018/9/20 15:52:37
2楼:
谢谢回复。 只是还是不知道解决方法,是调用方法错了?还是其它哪儿代码不对?
----------------------------------------------
-
作者:
2018/9/20 17:12:38
3楼:
Fortran没玩过,你确定你的这个my_add在Fortran中不需要做些什么就能直接导出到DLL吗?像Delphi中都需要export的。 建议你在Fortran中写好DLL后,先用Fortran测试一下,确保没问题,然后再用Delphi来调用。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
2018/9/20 17:58:18
4楼:
谢谢楼上!参考:http://www.g95.org/g95_dll.shtml A: This example produces a dll called ex.dll. Save the code below in file ex.f90. subroutine ex(i) integer i i=i+1 return end Compile and generate the dll with the following commands: g95 -c ex.f90 g95 -shared -mrtd -o ex.dll ex.o GFortran似乎的确不需要特别的定义
----------------------------------------------
-
作者:
2018/9/20 18:45:23
5楼:
把DLL文件上传,用PE工具看一下有没有输出表就知道DLL有没有问题
----------------------------------------------
-
作者:
2018/9/21 13:30:35
6楼:
函数参数类型定义问题
----------------------------------------------
-
作者:
2018/9/21 13:31:32
7楼:
procedure和function
----------------------------------------------
-
作者:
2018/9/22 11:01:32
8楼:
谢谢楼上! 找到了一点问题:CodeBlocks用自带的GNU Fortran编译出的动态库输出函数都会自动添加应该下划线“_”,Delphi或其它程序调用时需加上“_”,比如0#的: procedure my_add(x,y: Double;var z: double); StdCall; External 'add_dll.dll'; 改成: procedure my_add_(x,y: Double;var z: double); StdCall; External 'add_dll.dll'; 改正后,“无法定位程序输入点my_dll于动态链接库add_dll.dll上”错误没有了,但是点击按钮具体执行时还是出错: 两段Fortran代码: 1: subroutine my_add ( x, y, z) real ( kind = 8 ) x real ( kind = 8 ) y real ( kind = 8 ) z z = x + y end subroutine 2: subroutine my_add ( x, y, z) real ( kind = 8 ) x real ( kind = 8 ) y real ( kind = 8 ) z real ( kind = 8 ) t t = 1.0*x + 2.1*y end subroutine 分别编译成dll文件,Delphi调用计算,第一段出错,无法计算返回值;第二段可以运行,当然没有任何返回值,也没意义。上面代码看从Delphi传递进来得x,y和z都不能被赋值计算,否则出错。不知哪儿的问题?谢谢解答。
----------------------------------------------
-
作者:
2018/9/23 12:40:11
9楼:
dll传上来啊 不然大家都靠猜么
----------------------------------------------
-
作者:
2018/9/23 13:45:12
10楼:
参数用简单的类型,然后调试一下
----------------------------------------------
-