总结一下,我的问题在于编译C ++应用程序中的g95对象。 实际上,我正在为旧的fortran程序构建一个接口。 对于此任务,我正在使用wxWidgets GUI库,并在必要时调用fortran子例程。 开始时,我正在开发整个项目,使用gfortran(GCC附带)编译我的fortran文件,并通过g ++ -o ...命令将它们与我的app连接起来。一切都工作正常,但我的fotran子程序计算的一些数值返回NAN值。 做了一些研究,我意识到使用带有-m32标志的gfortran编译我的fortran文件会产生这个NAN值问题。虽然使用-m64标志进行编译,但我的代码运行良好。 这里唯一的麻烦是我的应用程序应该是32位然后我尝试了另一个compiller。在这里,我找到了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();
我还将g95 Fortran运行时库libf95.a和libgcc.a包含在我的链接器命令中。 完成后,我没有实现一个main方法,因为这是由wxWidgets管理的,而我的fortran子程序不能有一个main函数,因为这是一个调用fortran函数的C ++程序。
你们有些人可以帮我解决这个问题吗?如何修复MAIN__问题的未定义引用? 任何想法将不胜感激。
答案 0 :(得分:0)
我正在回答我自己的问题,因为我得到了解决方案。 问题不在于我的g95整合。 我只是覆盖了wxWidgets主宏以进行int main函数初始化,如下所示:
// 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值。
我希望这个问题可以帮助别人。