我已经在c ++中为一些旧的Fortran(g77,我认为)代码编写了一些包装器函数。我使用旧的Visual Fortran编译器创建了.dll和.lib,并将所有内容链接起来并在visual studio中工作。
我现在遇到的问题是创建一个等效的64位版本。我已经安装了gfortran并创建了一个64位.dll,但是没有生成.lib,我似乎无法链接到DLL或调用任何fortran函数。
我使用命令创建了我的64位.dll ...
$ gfortran -c {filenames.for}
$ gfortran -m64 -shared -mrtd -o dll_foo.dll {filenames.o}
这是来自fortran的示例子程序......
SUBROUTINE KFACT(TR, RHOL, RHOV, FLIQ, FVAP, XK, IWANT, PROPR)
!DEC$ ATTRIBUTES DLLEXPORT :: KFACT
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
INCLUDE 'nprop.cmn'
DIMENSION PROPR(NPROP)
DIMENSION IWANT(NPROP)
C
C SET IWANT VECTOR TO RETURN FUGACITY COEFFICIENT
C
CALL IVZERO(IWANT, NPROP)
IWANT(13) = 1
C
C CALL PROP2 TO RETURN VAP AND LIQ FUGACITY COEFFICIENTS
C
CALL PROPS2(IWANT, 0, TR, RHOL, PROPR)
FLIQ = PROPR(13)
CALL PROPS2(IWANT, 0, TR, RHOV, PROPR)
FVAP = PROPR(13)
C
XK = FLIQ / FVAP
C
RETURN
END
C
SUBROUTINE PDP(DEL, TR, PR, DPRDD, IWANT, PROPR)
如何从我的Visual Studio(2005)c ++项目创建要链接到的.dll和.lib文件?
///////////////////////////// UPDATE ///////////////// ////////////
我已经能够使用以下命令创建.lib文件...
ar -cru libName.lib {filenames.o}
ranlib libName.lib
将此lib添加到VS中的附加依赖项后,在调用它们时,我会收到所有fortran函数的LNK错误。 c ++中的fortran声明看起来像......
extern "C" void PSAT(double& TK, double& PMPA, double& RHOL, double& RHOV, int IWORK[], double PROPR[], int& IERR);
此功能的LNK错误......
error LNK2028: unresolved token (0A00004A) "extern "C" void __cdecl PSAT(double &,double &,double &,double &,int * const,double * const,int &)" (?PSAT@@$$J0YAXAEAN000QEAHQEANAEAH@Z) referenced in function "double __cdecl PFTH(double,double,int)" (?PFTH@@$$FYANNNH@Z)
error LNK2019: unresolved external symbol "extern "C" void __cdecl PSAT(double &,double &,double &,double &,int * const,double * const,int &)" (?PSAT@@$$J0YAXAEAN000QEAHQEANAEAH@Z) referenced in function "double __cdecl PFTH(double,double,int)" (?PFTH@@$$FYANNNH@Z)
我尝试在fortran代码中添加不同的指令来解析名称,但是我没有成功。
我不知道问题出在c代码,fortran代码或.lib文件的创建中。
非常感谢任何帮助!
答案 0 :(得分:0)
与基于MS的链接器不同,基于GNU的链接器不需要.lib文件。您需要做的就是使用lib为dll添加前缀。在你的情况下,它将是libdll_foo.dll。要链接,只需删除lib。例如,链接到名为main
的程序gfortran -o main.exe -ldll_foo main.f95
它需要libdll_foo在路径上。或者,你可以告诉它在哪里找到带有-L参数的libdll_foo.dll。
答案 1 :(得分:0)
我结束了与CMake一起创建我的X64 .lib文件。如果有人有兴趣,这是CMakeLists。
cmake_minimum_required(VERSION 2.8)
enable_language(Fortran)
set(CMAKE_Fortran_CREATE_SHARED_LIBRARY ON)
set(CMAKE_Fortran_COMPILER gfortran)
add_library(Steam64 SHARED AUXPK.o eospk.o INTPK.o PROPPK.o SOLVPK.o coef.cmn coefig.cmn nprop.cmn wconst.cmn)
SET_TARGET_PROPERTIES(Steam64 PROPERTIES LINKER_LANGUAGE C ARCHIVE_OUTPUT_DIRECTORY "C:/Users/MYNAH/Desktop/fortranSource/build")
add_executable(testf AUXPK.o eospk.o INTPK.o PROPPK.o SOLVPK.o coef.cmn coefig.cmn nprop.cmn wconst.cmn)
target_link_libraries(testf Steam64)