2012-11-27 9 views
1

나는이 질문을 읽고 있었다 : Linking fortran and c++ binaries using gcc.Fortran 77 프로그램과 C++ dll을 연결

누군가가 가능하면 C++을 사용하여 fortran 77과 비슷한 작업을 수행 할 수 있습니까?
Fortran 77 파일에서 일부 서브 루틴을 추출하여 C++ dll로 변환해야합니다. 새로 생성 된 dll은 이전 포트란 77 파일을 사용해야합니다.

&을 Fortran 77 파일을 C++ dll로 컴파일하는 방법에 대한 단계별 설명은 훌륭합니다. 나는 많은 것을 수색 해 왔으며 혼합 된 프로그래밍을하는 초심자이다.

답변

0

Fortran 프로그램에 C++을 연결하는 것은 모든 것이 extern "C"안에 있지 않는 한 mangling이라는 이름으로 인해 불가능합니다. 또는 인터페이스 extern "C"와 구현 C++을 만들 수도 있습니다.

이것은 기존의 Fortran 라이브러리를 다른 기사의 C++ 프로그램과 연결하는 방법입니다.

1) Fortran 서브 프로그램을 작성하십시오 (예 : worker.for). 이것은 F77이므로 6 개의 선행 공백을 기억하십시오.

 subroutine printhi 
     print *, 'it works' 
     end subroutine 

2)이를 호출하는 C++ 프로그램을 만듭니다 (예 : boss.cpp). 참고 후행는 루틴 F77

gfortran -c worker.for 

4) 구축 및 C++ 프로그램을 링크 구축 포트란 루틴 이름

#include <iostream> 
// Avoid any name mangling 
extern "C" 
{ 
extern void __attribute__((stdcall)) printhi_(void); 
} 

int main() 
{ 
    std::cout << "Calling fortran" << std::endl; 
    printhi_(); 
    std::cout << "Returned to C++" << std::endl; 
} 

3)에 밑줄. 포트란 라이브러리를 추가하여 포트란 특정 비트를 해결하십시오.

g++ boss.cpp worker.o -o cboss -L/usr/lib -lgfortran 

5)이 하나가 C++를 호출 포트란 프로그램을위한 프로그램

./a.out 
0

를 실행합니다. 인터페이스는 extern "C"에 있어야합니다. 그렇지 않으면 링커에서 인터페이스를 찾을 수 없습니다.

1) worker.cpp라는 C 루틴을 만듭니다. 루틴 이름 뒤의 밑줄 뒤에 유의하십시오.

#include <iostream> 
extern "C" 
{ 
extern void __attribute__((stdcall)) worker_() 
{ 
    std::cout << "Hey it works" << std::endl; 
} 
} 

2) boss.for라는 Fortran 프로그램을 만듭니다. C 루틴을 호출 할 때 밑줄이 없음에 유의하십시오.

 program main 
     external worker 
     print *, 'Calling C' 
     call worker 
     print *, 'Back to F77' 
     stop 
     end 

3) 포트란 코드

gfortran boss.for worker.o -o fboss -L/usr/lib -lstdc++ 
)를 C 코드

g++ -c worker.cpp 

4 컴파일 컴파일 및 링크