回 帖 发 新 帖 刷新版面

主题:Fortran能调用Fortran生成的dll文件吗?

我是用Fortran编写的动态链接库dll,本打算用C++或VB编写界面来调用这些dll文件的。可是由于时间关系,现在来不及编写界面了,我打算用Fortran编写一个主程序调用之前写的dll。我发现在我的主程序用call 关键词不能调用dll,只能调用子程序。请问用Fortran能调用Fortran生成的dll吗?怎么调用呢?急用啊!!

回复列表 (共8个回复)

沙发

当然可以啊。

调用的过程比较麻烦,帖子里不好说。建议你看一下彭国伦的书,关于混编的部分。

其他的书应该也会有相关章节。当然,我是指那些90后的书籍。

板凳


楼上你好!
    我的子程序是这样的:
   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 楼

我把主程序改为下列形式:
     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 楼

由于调用DLL的内容并不是语法规定的,所以各种编译器都有各自的处理方式。

最好的方法就是查看编译器的说明书或者参阅 sample 中关于 MixedLanguage 的演示代码。

通常混编来说,不止是通过代码控制,工程设置也需要相应的设置正确。

我不确定你用的什么编译器,也无法去测试它。因为不同编译器的混编方法都不完全相同。

但是从 The type of the actual argument differs from the type of the dummy argument.   [S_BLOCK1] 这一句来看,确实是参数不一致。

给出你的参数定义,或许会有帮助。

5 楼

你好。我现在不是混编,只是用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 楼

我用的编译器是Intel.Visual.Fortran.Compiler.Professional.v11.0
  我想给你看看我的项目属性,可是我用QQ截的图怎么贴不进来啊?!!

7 楼

如果我用
!DEC$ ATTRIBUTES DLLEXPORT::ALLMIX
代替!DEC$ OBJCOMMENT LIB:'C:\Program Files\ECSS\化工之星\dll\ALLMIX.lib'时,
出现这个错误:
error LNK2019: 无法解析的外部符号 _ALLMIX,该符号在函数 _MAIN__ 中被引用    Main.obj

8 楼


请您抽空帮我看看好吗?这是我的论文内容,很着急的。谢谢了!

我来回复

您尚未登录,请登录后再回复。点此登录或注册