Matlab 使用Gnumex和MinGW的MEX-fortran文件(77国集团)

Matlab 使用Gnumex和MinGW的MEX-fortran文件(77国集团),matlab,fortran,mex,fortran77,Matlab,Fortran,Mex,Fortran77,我最近遇到了一个问题。据我记忆,它过去工作得很好,但几周后,我再次尝试在MATLAB中使用fortran 77文件,但它给了我一个奇怪的错误。 好的,我使用名为mexopts\u f77.bat的Gnumex创建了MEX选项文件。 这是我在MATLAB中运行的命令: mex-v-fc:\Omid\Other\Gnumex\mexopts\u f77.bat-C sodex.f decsol.f 这是我得到的错误: -> Options file specified on command l

我最近遇到了一个问题。据我记忆,它过去工作得很好,但几周后,我再次尝试在MATLAB中使用fortran 77文件,但它给了我一个奇怪的错误。 好的,我使用名为
mexopts\u f77.bat的Gnumex创建了MEX选项文件。
这是我在MATLAB中运行的命令:

mex-v-fc:\Omid\Other\Gnumex\mexopts\u f77.bat-C sodex.f decsol.f

这是我得到的错误:

-> Options file specified on command line 
---------------------------------------------------------------- 
->    Options file           = C:\Omid\Other\Gnumex\mexopts_f77.bat 
      MATLAB                 = C:\PROGRA~2\MATLAB\R2011b 
->    COMPILER               = gcc 
->    Compiler flags: 
         COMPFLAGS           = -c -DMATLAB_MEX_FILE -fcase-upper -fnounderscoring 
         OPTIMFLAGS          = -O0 
         DEBUGFLAGS          = -g 
         arguments           =  
         Name switch         = -o 
->    Pre-linking commands   =  
->    LINKER                 = C:\PROGRA~2\MATLAB\R2011b\sys\perl\win32\bin\perl.exe C:\omid\other\gnumex\linkmex.pl 
->    Link directives: 
         LINKFLAGS           =  -LC:\Omid\Other\Gnumex\libs 
         LINKDEBUGFLAGS      = -g  -Wl,--image-base,0x28000000\n 
         LINKFLAGSPOST       =  
         Name directive      = -o sodex.mexw32 
         File link directive =  
         Lib. link directive =  
         Rsp file indicator  =  
->    Resource Compiler      = C:\PROGRA~2\MATLAB\R2011b\sys\perl\win32\bin\perl.exe C:\omid\other\gnumex\rccompile.pl  -o mexversion.res 
->    Resource Linker        =  
----------------------------------------------------------------


--> gcc  -c -DMATLAB_MEX_FILE -fcase-upper -fno-underscoring -osodex.obj -O0 -DMX_COMPAT_32 sodex.f 

gcc: error: unrecognized command line option '-fcase-upper' 

  C:\PROGRA~2\MATLAB\R2011B\BIN\MEX.PL: Error: Compile of 'sodex.f' failed.  
我认为问题在于
-fcase upper
选项。我查了一下,但找不到任何关于为
gcc
重新分级该选项的信息

编辑: 我在选项文件中将
gcc
手动更改为
g77
,并成功创建了目标文件,但在最后一步中仍然出现错误,我尝试将目标文件链接到名为
vdpsodex.F
的主fortran脚本并创建MEX文件。根据要求,我将包括选项文件:

@echo off
rem C:\Omid\Other\Gnumex\mexopts_f77.bat
rem Generated by gnumex.m script in C:\omid\other\gnumex
rem gnumex version: 2.06
rem Compile and link options used for building MEX etc files with
rem the Mingw/Cygwin tools.  Options here are:
rem Gnumex, version 2.06                     
rem MinGW linking                            
rem Mex (*.dll) creation                     
rem Libraries regenerated now                
rem Language: Fortran 77                     
rem Optimization level: -O0 (no optimization)
rem StorageVersion: 1.0
rem C++keyName: GNU C++
rem C++keyManufacturer: GNU
rem C++keyLanguage: C++
rem C++keyVersion:
rem C++keyFileName: GNUMEXOPTS.bat
rem Matlab version 7.13
rem
set GCCINSTALLDIR=C:\Omid\Other\MinGW\bin
set MATLAB=C:\PROGRA~2\MATLAB\R2011b
set GM_PERLPATH=C:\PROGRA~2\MATLAB\R2011b\sys\perl\win32\bin\perl.exe
set GM_UTIL_PATH=C:\omid\other\gnumex
set PATH=C:\Omid\Other\MinGW\bin;%PATH%
set PATH=%PATH%;C:\Cygwin\usr\local\gfortran\libexec\gcc\i686-pc-cygwin\4.3.0
set LIBRARY_PATH=C:\Omid\Other\MinGW\lib
set G95_LIBRARY_PATH=C:\Omid\Other\MinGW\lib
set MW_TARGET_ARCH=win32
rem
rem precompiled library directory and library files
set GM_QLIB_NAME=C:\Omid\Other\Gnumex\libs
rem
rem directory for .def-files
set GM_DEF_PATH=C:\Omid\Other\Gnumex\libs
rem
rem Type of file to compile (mex or engine)
set GM_MEXTYPE=mex
rem
rem Language for compilation
set GM_MEXLANG=f77
rem
rem File for exporting mexFunction symbol
set GM_MEXDEF=C:\Omid\Other\Gnumex\libs\fmex.def
rem
set GM_ADD_LIBS=-lg2c -lflibmx -lflibmex -lflibmat
rem
rem compiler options; add compiler flags to compflags as desired
set NAME_OBJECT=-o
rem ************ This is where I replaced gcc with g77 ************
set COMPILER=g77
rem ***************************************************************
set COMPFLAGS=-c -DMATLAB_MEX_FILE -fcase-upper -fno-underscoring 
set OPTIMFLAGS=-O0
set DEBUGFLAGS=-g
rem
rem NB Library creation commands occur in linker scripts
rem but LIBLOC is provided for compatibility with
rem mex.getCompilerConfigurations
rem
rem Linker parameters
set LIBLOC=
set LINKER=%GM_PERLPATH% %GM_UTIL_PATH%\linkmex.pl
set LINKFLAGS=
set LINKOPTIMFLAGS=-s
set LINKDEBUGFLAGS=-g  -Wl,--image-base,0x28000000\n
set LINKFLAGS= -LC:\Omid\Other\Gnumex\libs
set LINK_FILE=
set LINK_LIB=
set NAME_OUTPUT=-o %OUTDIR%%MEX_NAME%.mexw32
rem
rem Resource compiler parameters
set RC_COMPILER=%GM_PERLPATH% %GM_UTIL_PATH%\rccompile.pl  -o %OUTDIR%mexversion.res
set RC_LINKER=
现在,上面的代码确实为我提供了对象文件,但当我尝试使用以下命令生成最终的MEX文件时:

mex -v -f C:\Omid\Other\Gnumex\mexopts_f77.bat vdpsodex.F sodex.obj decsol.obj
它给了我以下错误:

-> Options file specified on command line 
---------------------------------------------------------------- 
->    Options file           = C:\Omid\Other\Gnumex\mexopts_f77.bat 
      MATLAB                 = C:\PROGRA~2\MATLAB\R2011b 
->    COMPILER               = g77 
->    Compiler flags: 
         COMPFLAGS           = -c -DMATLAB_MEX_FILE -fcase-upper -fno-underscoring 
         OPTIMFLAGS          = -O0 
         DEBUGFLAGS          = -g 
         arguments           =  
         Name switch         = -o 
->    Pre-linking commands   =  
->    LINKER                 = C:\PROGRA~2\MATLAB\R2011b\sys\perl\win32\bin\perl.exe C:\omid\other\gnumex\linkmex.pl 
->    Link directives: 
         LINKFLAGS           =  -LC:\Omid\Other\Gnumex\libs 
         LINKDEBUGFLAGS      = -g  -Wl,--image-base,0x28000000\n 
         LINKFLAGSPOST       =  
         Name directive      = -o vdpsodex.mexw32 
         File link directive =  
         Lib. link directive =  
         Rsp file indicator  =  
->    Resource Compiler      = C:\PROGRA~2\MATLAB\R2011b\sys\perl\win32\bin\perl.exe C:\omid\other\gnumex\rccompile.pl  -o mexversion.res 
->    Resource Linker        =  
---------------------------------------------------------------- 


--> g77  -c -DMATLAB_MEX_FILE -fcase-upper -fno-underscoring -oC:\Users\GHASEM~1\AppData\Local\Temp\2\mex_7FJjxb\vdpsodex.obj -O0 -DMX_COMPAT_32 vdpsodex.F 


--> C:\PROGRA~2\MATLAB\R2011b\sys\perl\win32\bin\perl.exe C:\omid\other\gnumex\linkmex.pl -o vdpsodex.mexw32  -LC:\Omid\Other\Gnumex\libs -s  C:\Users\GHASEM~1\AppData\Local\Temp\2\mex_7FJjxb\vdpsodex.obj  sodex.obj  decsol.obj   

C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00068.o):(.idata$7+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib' 
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00086.o):(.idata$7+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib' 
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00062.o):(.idata$7+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib' 
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00157.o):(.idata$7+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib' 
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00161.o):(.idata$7+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib' 
collect2: ld returned 1 exit status 
link command: g77 -shared C:\Omid\Other\Gnumex\libs\fmex.def -o vdpsodex.mexw32 -LC:\Omid\Other\Gnumex\libs -s C:\Users\GHASEM~1\AppData\Local\Temp\2\mex_7FJjxb\vdpsodex.obj sodex.obj decsol.obj -lg2c -lflibmx -lflibmex -lflibmat 

  C:\PROGRA~2\MATLAB\R2011B\BIN\MEX.PL: Error: Link of 'vdpsodex.mexw32' failed. 
最后,我能够指出这个问题,我认为分享答案可能对其他可能面临相同问题(或类似问题)的人有益。首先让我提一下,这对我来说很奇怪,因为我使用了由Gnumex创建的选项files对完全相同的文件进行了MEX,并且没有任何问题。我只是注意到,因为我不久前更改了我的MinGW构建,所以即使我重新创建了选项文件(
mexopts\u f77.bat
),我也无法再使用相同的Fortran文件

总之,长话短说,我觉得这很有用。基本上,它建议下载五个包并将它们解压缩到MinGw的根目录。其中四个链接仍然存在。其中一个已经死了,但我通过谷歌搜索包名找到了它。您在下面看到的是软件包的更新链接

最后但并非最不重要的一点是,如果您的77国集团不使用Gnumex制作的选项文件,这里有一个解决方案:

  • 下载以下软件包:
  • 将它们解压缩到您的MinGW根目录,例如
    C:\MinGW
  • 通过选择Fortran 77作为编译语言重新生成选项文件,例如
    mexopt\u f77.bat
  • MEX使用以下语法编写Fortran脚本

    mex-f[选项文件][fortran文件.f]

  • 如果需要将某些文件链接到主脚本,则必须先将它们编译为对象文件,然后再链接它们

    mex-f[options file]-c[linkfile1.f][linkfile2.f]

    mex-f[选项文件][fortran文件.f][linkfile1.obj][linkfile2.obj]


  • 哎呀,床垫搞砸了。我该如何编辑这个问题?好吧,现在看起来好多了,但仍然不是我所期望的。好吧,它现在和我在MATLAB命令窗口中看到的完全一样。好吧,让我们看看是否有人能指出问题所在。
    -fcase upper
    是一个
    g77
    选项,不被
    gfortran
    识别。你需要它吗?如果删除它会发生什么?Fortran是不区分大小写的…正如我在标题中提到的,我的编译器是g77。但我不明白为什么它总是给我错误,即使代码是fortran 77语法。当我从选项文件中删除它时,它表示它无法识别创建的.obj文件格式。