Ошибка связи MinGW / G ++ / g95 - неопределенная ссылка libf95 на MAIN_ - PullRequest
2 голосов
/ 08 марта 2010

Подводя итог, моя проблема заключается в компиляции объектов g95 внутри приложения C ++. На самом деле, я создаю интерфейс для старой программы на Фортране. Для этой задачи я использую библиотеку графического интерфейса пользователя wxWidgets и при необходимости вызываю подпрограммы fortran. Вначале я разрабатывал весь проект, компилируя мои файлы fortran с помощью gfortran (который поставляется с GCC) и связывал их с моим приложением командой g ++ -o .... Все работало нормально, но некоторые числовые значения, вычисленные моими подпрограммами fotran, возвращали значения NAN. Проведя некоторые исследования, я понял, что компиляция моих файлов fortran с gfortran с флагом -m32 порождает эту проблему значений NAN. Несмотря на компиляцию с флагом -m64, мой код работает нормально. Единственная проблема здесь в том, что мое приложение должно быть 32 бита, а затем я попробовал другой компилятор. Здесь я нашел компилятор g95 Fortran, который компилирует мой код 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. 

Я уже прочитал Руководство по g95 для интеграции с C ++ и фактически называю эти функции ниже для управления средой fortran: void g95_runtime_start (int argc, char * argv []); void g95_runtime_stop ();

Я также включил библиотеку времени выполнения Fortran g95 libf95.a и libgcc.a в мою команду компоновщика. Наконец, у меня нет реализованного метода main, потому что он управляется wxWidgets, и мои подпрограммы на языке fortran не могут иметь функцию main, потому что это программа C ++, вызывающая функции на языке fortran.

Может, некоторые из вас, ребята, помогут мне с этой проблемой? Как я могу исправить эту неопределенную ссылку на проблему MAIN__? Любая идея будет высоко ценится.

1 Ответ

0 голосов
/ 08 марта 2010

Я отвечаю на свой вопрос, потому что у меня есть решение.Проблема была не в моей интеграции с G95.Я просто перезаписываю основной макрос wxWidgets для инициализации основной функции int, как показано ниже:

// 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.

Я надеюсь, что этот вопрос может помочь другим.

...