主题:Fortran能调用Fortran生成的dll文件吗?
零维空间
[专家分:0] 发布于 2012-02-29 21:29:00
我是用Fortran编写的动态链接库dll,本打算用C++或VB编写界面来调用这些dll文件的。可是由于时间关系,现在来不及编写界面了,我打算用Fortran编写一个主程序调用之前写的dll。我发现在我的主程序用call 关键词不能调用dll,只能调用子程序。请问用Fortran能调用Fortran生成的dll吗?怎么调用呢?急用啊!!
回复列表 (共8个回复)
沙发
臭石头雪球 [专家分:23030] 发布于 2012-03-01 08:44:00
当然可以啊。
调用的过程比较麻烦,帖子里不好说。建议你看一下彭国伦的书,关于混编的部分。
其他的书应该也会有相关章节。当然,我是指那些90后的书籍。
板凳
零维空间 [专家分:0] 发布于 2012-03-01 09:34:00
楼上你好!
我的子程序是这样的:
subroutine allmix [AlIAS:'allmix'](s_block1,s_strin,s_strout,s_blkion)
!DEC$ ATTRIBUTES DLLEXPORT::ALLMIX
主程序是这样的:
program main
!DEC$ ATTRIBUTES DLLEXPORT::ALLMIX
……
call allmix(s_block1,s_strin,s_strout,s_blkion)
……
end program
可是在运行时出现下列错误:
error LNK2019: 无法解析的外部符号 _ALLMIX,该符号在函数 _MAIN__ 中被引用 Main.obj
请问这是什么原因啊??谢谢了
3 楼
零维空间 [专家分:0] 发布于 2012-03-01 09:48:00
我把主程序改为下列形式:
program main
!DEC$ OBJCOMMENT LIB:'C:\Program Files\AA\dll\ALLMIX.lib'
……
call allmix(s_block1,s_strin,s_strout,s_blkion)
……
end program
可是在运行时出现下列错误:
error #6633: The type of the actual argument differs from the type of the dummy argument. [S_BLOCK1]
参数s_strin,s_strout, s_bikon也是同样的错误。实参和虚参类型不一样!!!
问题真的出在这吗?还有就是这些参数都是结构体变量。
4 楼
臭石头雪球 [专家分:23030] 发布于 2012-03-01 11:05:00
由于调用DLL的内容并不是语法规定的,所以各种编译器都有各自的处理方式。
最好的方法就是查看编译器的说明书或者参阅 sample 中关于 MixedLanguage 的演示代码。
通常混编来说,不止是通过代码控制,工程设置也需要相应的设置正确。
我不确定你用的什么编译器,也无法去测试它。因为不同编译器的混编方法都不完全相同。
但是从 The type of the actual argument differs from the type of the dummy argument. [S_BLOCK1] 这一句来看,确实是参数不一致。
给出你的参数定义,或许会有帮助。
5 楼
零维空间 [专家分:0] 发布于 2012-03-01 11:42:00
你好。我现在不是混编,只是用Fortran主程序调用用Fortran写好的dll文件。
刚才我是为了简化,少写了一个参数。
现在我把原始的程序贴出来。子程序:
subroutine allmix [AlIAS:'allmix'](s_block1,s_block2,s_strin,s_strout,s_blkion) !
!DEC$ ATTRIBUTES DLLEXPORT::ALLMIX
parameter(IMLimiter=30)
structure /str/
integer relat1,relat2,indx(10)
real*8 x(IMLimiter),f,t,p,h,dens,e,s,g,b,vis,cond,sigma,cp,pro(3)
end structure
structure/block1/
integer type1,type2,algorithm,ppmodel(10),indexx(10),unit(5),unitstate
real*4 para(10),pmetrix(IMLimiter,10),design(5,5)
end structure
structure/block2/
integer atom(IMLimiter,10)
real*8 reacm(IMLimiter,10)
integer nisr(30)
real*8 bisr(30),mu(IMLimiter)
end structure
structure/blkion/
integer ni,nm,no,noi(10),nom(10),noo(10)
end structure
record/str/instr(10),outstr(10),iistr,midstr(10),s_strin(10),s_strout(10)
record/block1/s_block1,blk1
record/block2/s_block2,blk2
record/blkion/s_blkion,blkn
common/block1/blk1
common/block2/blk2
common/blkion/blkn
……
end subroutine
主程序如下:
program main
!DEC$ OBJCOMMENT LIB:'C:\Program Files\AA\dll\ALLMIX.lib'
parameter(IMLimiter=30)
structure /str/
integer relat1,relat2,indx(10)
real*8 x(30),f,t,p,h,dens,e,s,g,b,vis,cond,sigma,cp,pro(3)
end structure
structure/block1/
integer type1,type2,algorithm,ppmodel(10),index(10),unit(5),unitstate
real*4 para(10),pmetrix(IMLimiter,10),design(5,5)
end structure
structure/block2/
integer atom(IMLimiter,10)
real*8 reacm(IMLimiter,10)
integer nisr(30)
real*8 bisr(30),mu(IMLimiter)
end structure
structure/blkion/
integer ni,nm,no,noi(10),nom(10),noo(10)
end structure
record/str/instr(10),outstr(10),iistr,midstr(10),s_strin(10),s_strout(10)
record/block1/s_block1,blk1
record/block2/s_block2,blk2
record/blkion/s_blkion,blkn
common/block1/blk1
common/block2/blk2
common/blkion/blkn
……
……
call allmix(s_block1,s_block2,s_strin,s_strout,s_blkion)
……
end program
现在的问题是前四个参数有问题,最后一个s_blkion没有问题。错误如下:
error #6633: The type of the actual argument differs from the type of the dummy argument. [S_BLOCK1]
error #6633: The type of the actual argument differs from the type of the dummy argument. [S_BLOCK2]
error #6633: The type of the actual argument differs from the type of the dummy argument. [S_STRIN]
error #6633: The type of the actual argument differs from the type of the dummy argument. [S_STROUT]
6 楼
零维空间 [专家分:0] 发布于 2012-03-01 11:53:00
我用的编译器是Intel.Visual.Fortran.Compiler.Professional.v11.0
我想给你看看我的项目属性,可是我用QQ截的图怎么贴不进来啊?!!
7 楼
零维空间 [专家分:0] 发布于 2012-03-01 12:28:00
如果我用
!DEC$ ATTRIBUTES DLLEXPORT::ALLMIX
代替!DEC$ OBJCOMMENT LIB:'C:\Program Files\ECSS\化工之星\dll\ALLMIX.lib'时,
出现这个错误:
error LNK2019: 无法解析的外部符号 _ALLMIX,该符号在函数 _MAIN__ 中被引用 Main.obj
8 楼
零维空间 [专家分:0] 发布于 2012-03-02 13:24:00
请您抽空帮我看看好吗?这是我的论文内容,很着急的。谢谢了!
我来回复