我在将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中的add2r
,simpson
和C:\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,因为它需要第三方功能。
我看了其他帖子,找不到这个问题的答案:
我没有得到"Add as Link" option when right clicking Add->Existing Item
this post的答案没有解决我的问题
类似的问题here未得到充分回答
如果可能的话,请提供有关使用gfortran和Intel Visual Studio Fortran使Fortran与DLLIMPORT一起使用的分步指南。我只想要一些有用的东西......