2010-03-08 3 views
2

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

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

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

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

ответ

0

Я отвечаю на свой вопрос, потому что у меня есть решение. Проблема не в моем g95-подключении. Я просто переписать главный макрос 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()'. –