2010-03-08 1 views
2

요약하면 내 문제는 C++ 응용 프로그램 내에서 g95 객체를 컴파일하는 것으로 구성됩니다. 사실, 저는 오래된 포트란 프로그램을위한 인터페이스를 만들고 있습니다. 이 작업에서는 wxWidgets GUI 라이브러리를 사용하고 필요할 때 Fortran 서브 루틴을 호출합니다. 처음에는 gfortran (GCC와 함께 제공)을 사용하여 fortran 파일을 컴파일하고 g ++ -o ... 명령으로 내 응용 프로그램과 연결하는 전체 프로젝트를 개발했습니다. 모든 것이 잘 작동했지만 내 fotran 서브 루틴에 의해 계산 된 일부 숫자 값은 NAN 값을 반환했습니다. 몇 가지 조사를 해보니 gfortran을 -m32 플래그로 컴파일하면 Fortran 파일을 컴파일 할 때 NAN 값 문제가 발생한다는 것을 알았습니다. -m64 플래그로 컴파일하더라도 내 코드는 제대로 작동합니다. 유일한 문제는 내 응용 프로그램이 32 비트이어야하고 다른 컴파일러를 tryed해야한다는 것입니다. 여기에 필자는 포트란 코드를 컴파일하고 32 비트 환경에서 올바른 결과를 제공하는 g95 Fortran 컴파일러를 발견했습니다. 하지만 난이 다음과 같은 오류 참조 내 프로그램에 이러한 G95 객체를 연결하기 위해 노력하고있어 때MinGW/G ++/g95 링크 오류 - libf95 'MAIN_'에 대한 정의되지 않은 참조

g++ -oCyclonTechTower.exe src\fortran\Modulo_Global.o src\fortran\Prop_Fisicas.o src\fortran\inversa.o src\fortran\tower.o src\fortran\PredadeCarga.o src\fortran\gota.o src\fortran\tadi.o src\view\SimulationORSATCustomDialog.o src\view\SimulationChildGUIFrame.o src\view\ParentGUIFrame.o src\view\ClientGUIFrame.o src\model\TowerData.o src\controller\SimulationController.o src\THEIACyclonTechTower.o ..\Resource\resource.o -Lc:\wxWidgets-2.6.4\lib -Lc:\MinGW\lib\gcc-lib\i686-pc-mingw32\4.1.2 -Bdynamic -Wl,--subsystem,windows -mwindows c:\wxWidgets-2.6.4\lib\libwx_mswu-2.6.a -lwxregexu-2.6 -lwxexpat-2.6 -lwxtiff-2.6 -lwxjpeg-2.6 -lwxpng-2.6 -lwxzlib-2.6 -lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -lctl3d32 -ladvapi32 -lwsock32 -lgdi32 -lgcc -lf95 
**c:\MinGW\lib\gcc-lib\i686-pc-mingw32\4.1.2/libf95.a(main.o):(.text+0x32): undefined reference to `MAIN_' 
collect2: ld returned 1 exit status** 
Build error occurred, build is stopped 
Time consumed: 1531 ms. 

을 나는이 이미 C와 통합을위한 G95 사용 설명서를 읽어 ++ 그리고 실제로 이러한 기능을 제어하기위한 노호 전화 드렸습니다 포트란 환경 : void g95_runtime_start (int argc, char * argv []); void g95_runtime_stop();

또한 g95 Fortran 런타임 라이브러리 libf95.a와 libgcc.a를 링커 명령에 포함 시켰습니다. 마무리, wxWidgets에 의해 관리되기 때문에 main 메소드가 구현되지 않았습니다. fortran 함수를 호출하는 C++ 프로그램이기 때문에 fortran 서브 루틴은 main 함수를 가질 수 없습니다.

여러분 중 일부는이 문제를 도와 줄 수 있습니까? 이 정의되지 않은 MAIN__ 문제를 어떻게 해결할 수 있습니까? 어떤 아이디어라도 대단히 감사하겠습니다.

답변

0

나는 해결책을 얻었 기 때문에 나는 내 자신의 질문에 대답하고있다. 문제는 g95 통합 문제가 아닙니다. 울부 짖는 소리 제시된 난 그냥 int로 주요 기능 초기화에 대한 wxWidgets에 주요 매크로를 덮어 :

// Give wxWidgets the means to create a MyApp object 
//IMPLEMENT_APP(MyApp); 

int main(int argc, char *argv[]) { 

    //MyWxApp derives from wxApp 
    MyApp *myapp = new MyApp(); 
    wxApp::SetInstance(myapp); 
    wxEntryStart(argc, argv); 
    myapp->OnInit(); 

    myapp->OnRun(); 
    myapp->OnExit(); 
    wxEntryCleanup(); 

} 

을 그건 그렇고, 필요한 주요 기능은 현재 정의되고 내 응용 프로그램은 이제 NAN 값없이 잘 제대로 작동합니다.

이 질문이 다른 사람들을 도울 수 있기를 바랍니다.

+0

당신은'OnInit()'과 & c를 직접 호출하면 안된다. 이것은 작동하지 않을 것이다. 대신'wxEntry()'를 직접 호출하고 IMPLEMENT_APP_NO_MAIN() 매크로를 사용하십시오. –

관련 문제