2014-05-12 5 views
2

C++ 코드에서 fortran dll을로드하고 fortran dll에서 함수를 호출하려고합니다. C++ 코드를 사용하여 FORTRAN DLL에서 함수 호출

다음

는 코드 foo.dll를 [fotran DLL]의 생성 후

SUBROUTINE SUB1() 
    PRINT *, 'I am a function ' 
    END 

이 I는 포트란 DLL을로드 작성한 비주얼 스튜디오 2012 년 folowing C++ 코드이다. 와 나는 다음과 같은 오류가 발생하고 실행하는 동안 포트란 코드

#include <iostream> 
#include <fstream> 
#include <Windows.h> 

using namespace std; 
extern "C" void SUB1(); 
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 

int main(void) 
{ 
       LoadLibrary(L"foo.dll"); 

       PGNSI pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("foo.dll")),"SUB1"); 

       return 0; 

} 

의 기능 SUB1 전화 :

libgcc_s_dw2-1.dll 컴퓨터에서 누락되기 때문에 프로그램을 시작할 수 없습니다. 이 문제를 해결하려면 프로그램을 다시 설치하십시오.

C++에서 dll을 호출하는 올바른 방법입니까? 나는이 fortran dll에 매우 익숙하다. 제발 도와주세요.

이 같은 기능을 내보낼 필요의
+0

당신의 OS, 포트란 및 C++ 컴파일러를 게시하시기 바랍니다 ... 아래와 같이 VS에서 FORTRAN 노출 된 함수를 호출 할 수 있습니다. 컴파일러 플래그도 유용 할 것입니다. Fortran-C 상호 운용성으로 시작하려면 [fortran-iso-c-binding] (http://stackoverflow.com/tags/fortran-iso-c-binding/info)을 검색하십시오. – Peter

답변

1

먼저 ...

!fortcall.f90 
subroutine Dll1() BIND(C,NAME="Dll1") 
implicit none 
!DEC$ ATTRIBUTES DLLEXPORT :: Dll1 
PRINT *, 'I am a function' 
return 
end !subroutine Dll1 

는, 명령 그 후

gfortran.exe -c fortcall.f90 
gfortran.exe -shared -static -o foo.dll fortcall.o 

를 다음 사용하여 DLL을 만들기 두는에서 libgcc_s_dw2-1.dll, libgfortran-3.dlllibquadmath-0.dll VS의 응용 프로그램 경로. 또는 환경에 PATH를 추가 할 수 있습니다.

는 그 후, 당신은

#include <iostream> 
#include <Windows.h> 

using namespace std; 
extern "C" void Dll1(); 
typedef void(* LPFNDLLFUNC1)(); 

int main(void) 
{ 
    HINSTANCE hDLL; 
    LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer 

    hDLL = LoadLibrary(L"foo.dll"); 

    if (hDLL != NULL) 
    { 
     lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"Dll1"); 
     if (!lpfnDllFunc1) 
     { 
      // handle the error 
      FreeLibrary(hDLL); 
      return -1; 
     } 
     else 
     { 
      // call the function 
      lpfnDllFunc1(); 
     } 
    } 
    return 0; 
} 
+0

'! DEC $ ATTRIBUTES DLLEXPORT'는 실제로 무엇을하고 있습니까? 나는 gfortran이'! DEC $'지시자를 무시한다고 믿는다. GCC는 기본적으로 모든 심볼을 AFAIK로 내 보냅니다. return 문이 반드시 필요한 것은 아닙니다. –