使用DLLIMPORT将{DLL}导入Fortran

时间:2015-10-02 19:54:56

标签: visual-studio dll import fortran dllimport

我在将DLL导入到当前的Fortran项目时遇到问题。我尝试导入的DLL文件fdlltest.dll在我dumpbin /exports时定义了以下函数:

C:\temp>dumpbin /exports fdlltest.dll
Microsoft (R) COFF/PE Dumper Version 12.00.40629.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file fdlltest.dll

File Type: DLL

  Section contains the following exports for fdlltest.dll

    00000000 characteristics
    560ED478 time date stamp Fri Oct 02 14:01:12 2015
        0.00 version
           1 ordinal base
           3 number of functions
           3 number of names

    ordinal hint RVA      name

          1    0 00001000 add2i
          2    1 00001010 add2r
          3    2 00001040 simpson

  Summary

        1000 .data
        1000 .rdata
        1000 .reloc
        1000 .rsrc
        1000 .text

接下来,我需要逐步了解如何将位于add2i的此DLL中的add2rsimpsonC:\temp函数导入到当前Fortran项目。我不想要使用* .lib的示例,因为一旦我通过这个示例我想要使用的实际DLL没有伴随* .lib。这是我的Fortran代码,它应该生成一个链接到DLL文件的EXE:

program fdllrun
 implicit none
INTERFACE
 INTEGER FUNCTION add2i(a,b) 
!DEC$ ATTRIBUTES DLLIMPORT, ALIAS:"add2i" :: add2i
!DEC$ ATTRIBUTES REFERENCE::a, b
  INTEGER, intent(in), value:: a, b
 END FUNCTION add2i

 REAL FUNCTION add2r(a,b)
!DEC$ ATTRIBUTES DLLIMPORT, ALIAS:"add2r" :: add2r
!DEC$ ATTRIBUTES REFERENCE::a, b
  REAL, intent(in), value:: a, b
 END FUNCTION add2r

 REAL FUNCTION simpson(f, a, b, n) 
!DEC$ ATTRIBUTES DLLIMPORT, ALIAS:"simpson" :: simpson
!DEC$ ATTRIBUTES REFERENCE::f, a, b, n
  EXTERNAL f
  real, intent(in), value ::  a, b
  integer, intent(in), value :: n
 END FUNCTION simpson
END INTERFACE 

 ! Variables
 INTEGER :: i1, i2, ians
 i1=1
 i2=2

 ! Body of fdllrun
 ians = add2i(i1, i2)
 print '(I3)', ians

end program fdllrun

在英特尔Visual Studio Fortran中,我尝试右键单击我的项目并执行添加 - >现有项目,然后浏览到位于C:\ temp的DLL文件,然后浏览Build All。这是行不通的。我尝试编译时遇到的错误是:

Error 1  error LNK2019: unresolved external symbol __imp_add2i referenced in function _MAIN__ fdllrun.obj
Error 2  fatal error LNK1120: 1 unresolved externals Release\fdllrun.exe 

我已经尝试了其他几个Fortran编译器,包括g95和gfortran(MinGW和TDM-GCC两种),但是我没有尝试过任何运气。 TDM-GCC gfortran可能是我得到的最接近的,因为我可以运行从gfortran创建的DLL,但不能在C中运行。事实上,在TDM-GCC gfortran中,在我创建了一个引用C DLL的Fortran DLL之后,所有函数即使在编译Fortran DLL之后没有给出警告,在Excel VBA中调用Fortran生成的DLL也会立即返回0!在其他情况下,它说它无法在DLL中找到函数名称,即使我没有装饰或下划线。从该构建中排除C DLL将消除该问题,但当然,我需要引用C DLL,因为它需要第三方功能。

我看了其他帖子,找不到这个问题的答案:

如果可能的话,请提供有关使用gfortran和Intel Visual Studio Fortran使Fortran与DLLIMPORT一起使用的分步指南。我只想要一些有用的东西......

0 个答案:

没有答案