2013-06-10 5 views
0

에 대한 lib 디렉토리 파일을 만들 수 없습니다 코드 (G77, 나는 생각한다). 이전 Visual Fortran 컴파일러를 사용하여 .dll 및 .lib를 만들고 Visual Studio에서 모든 작업을 연결하고 작업했습니다.나는 오래된 포트란을위한 C의 ++에서 일부 래퍼 함수를 ​​쓴 64 비트 포트란 DLL

문제 지금은 동등한 64 비트 버전을 창조하고있다. 나는 gfortran을 설치했고 64 비트 .dll을 만들었지 만 .lib은 그와 함께 생성되지 않았고 DLL 없이도 링크하지 못하거나 fortran 함수를 호출하지 못했습니다.

나는 나는 .DLL을 만들 수있는 방법 여기

$ gfortran -c {filenames.for} 
    $ gfortran -m64 -shared -mrtd -o dll_foo.dll {filenames.o} 

그리고 포트란에서 샘플 서브 루틴은 명령 내 64 비트 .DLL ...

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) 

을 생성 .lib 파일을 내 Visual Studio (2005) C++ 프로젝트에서 링크 할 수 있습니까?

///////////////////////////// UPDATE //////////////// /////////////

나는 다음과 같은 명령어를 사용하여 .LIB 파일을 생성 할 수있게되었습니다 ...

ar -cru libName.lib {filenames.o} 
ranlib libName.lib 

내 추가 종속성이 lib 디렉토리를 추가 한 후 VS에서는 모든 Fortran 함수가 호출 될 때 LNK 오류가 발생합니다. 내가 좋아하는 이름을 해결하기 위해 포트란 코드에서 다른 지시를 추가하는 시도

error LNK2028: unresolved token (0A00004A) "extern "C" void __cdecl PSAT(double &,double &,double &,double &,int * const,double * const,int &)" ([email protected]@[email protected]) referenced in function "double __cdecl PFTH(double,double,int)" ([email protected]@[email protected]) 


error LNK2019: unresolved external symbol "extern "C" void __cdecl PSAT(double &,double &,double &,double &,int * const,double * const,int &)" ([email protected]@[email protected]) referenced in function "double __cdecl PFTH(double,double,int)" ([email protected]@[email protected]) 

을 c 포트란 선언 ... 같은

extern "C" void PSAT(double& TK, double& PMPA, double& RHOL, double& RHOV, int IWORK[], double PROPR[], int& IERR); 

이 기능에 대한 LNK 오류를 봐 ... ++ 그러나 나는 실패했다.

문제가 C 코드, 포트란 코드 또는 lib 디렉토리 파일의 생성에있는 경우 모르겠어요.

도움이 될 것입니다.

답변

0

MS 기반 링커는 달리, GNU 기반의 링커는 lib 디렉토리 파일이 필요하지 않습니다. DLL에 접두사를 붙이기 만하면됩니다. 귀하의 경우에는 libdll_foo.dll이됩니다. 링크하려면 lib를 삭제하십시오. 예를 들어 main이라는 프로그램에 연결하려면

gfortran -o main.exe -ldll_foo main.f95 

경로에 libdll_foo가 있어야합니다. 또는 -L 매개 변수를 사용하여 libdll_foo.dll을 찾을 위치를 알 수 있습니다.

+0

나는 내 질문에 분명하다고 생각하지 않습니다. gfortran을 사용하여 .exe를 컴파일하지 않고 VS에서 내 C++ 프로젝트에 연결하려면 .dll이 필요합니다. 나는 명확성을 위해 질문을 편집했다. – Wayne

+0

gfortran 및 VS 바이너리는 호환되지 않습니다. gfortran을 C++ 프로젝트에 연결하려면 gcc에서 C++ 코드를 다시 빌드해야합니다. 기본적으로, 당신은 비주얼 툴을 모든 방법으로 또는 GNU 모든 방법으로 사용합니다. 개체 파일과 DLL 형식이 다릅니다. MS DLL과 달리 GNU DLL에는 DLLMain이 없습니다. – cup

+0

정보를 제공해 주셔서 감사 드리며, CMake와 함께 .lib 파일을 만들었습니다. – Wayne

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)