2

要約すると、私の問題は、C++アプリケーション内でg95オブジェクトをコンパイルすることにあります。実際、私は古いFortranプログラムのインターフェースを構築しています。このタスクでは、wxWidgets GUIライブラリを使用しており、必要に応じてfortranサブルーチンを呼び出しています。最初は、プロジェクト全体を開発して、Fortranファイルをgfortran(GCCに付属)でコンパイルし、g ++-o...コマンドでアプリにリンクしていました。すべてが正常に機能していましたが、私のfotranサブルーチンによって計算されたいくつかの数値はNAN値を返しました。調査を行ったところ、fortranファイルを-m32フラグを指定したgfortranでコンパイルすると、このNAN値の問題が発生することがわかりました。-m64フラグを使用してコンパイルしていますが、私のコードは正しく機能します。ここでの唯一の問題は、アプリが32ビットである必要があることです。その後、別のコンパイラを試しました。ここで私はg95Fortranコンパイラーを見つけました。これは私のfortranコードをコンパイルし、32ビット環境で正しい出力を提供します。しかし、これらのg95オブジェクトをプログラムにリンクしようとすると、次のエラーが表示されます。

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マニュアルをすでに読んでおり、実際には、Fortran環境を制御するために次の関数を呼び出しています。voidg95_runtime_start(int argc、char * argv []); void g95_runtime_stop();

また、g95Fortranランタイムライブラリlibf95.aとlibgcc.aをリンカーコマンドに含めました。最後に、これはwxWidgetsによって管理されているため、mainメソッドを実装していません。また、これはfortran関数を呼び出すC ++プログラムであるため、fortranサブルーチンにmain関数を含めることはできません。

皆さんの何人かはこの問題で私を助けてくれますか?MAIN__問題へのこの未定義の参照を修正するにはどうすればよいですか?どんなアイデアでも大歓迎です。

4

1 に答える 1

0

解決策を得たので、私は自分の質問に答えています。問題は私の g95 統合にはありませんでした。以下に示すように、int main 関数の初期化のために 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 値なしで適切に動作するようになりました。

この質問が他の人に役立つことを願っています。

于 2010-03-08T17:05:06.650 に答える