使用 Gnumex 和 MinGW (g77) 的 MEX fortran 文件
MEX fortran file using Gnumex and MinGW (g77)
我最近 运行 遇到了一个问题。据我所知,它曾经工作得很好,但几周后我再次尝试在 MATLAB 中 MEX 一个 fort运行 77 文件,但它给了我一个奇怪的错误。
好的,我使用名为 mexopts_f77.bat
的 Gnumex 创建了 MEX 选项文件。
这是我在 MATLAB 中 运行 的命令:
mex -v -f C:\Omid\Other\Gnumex\mexopts_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
并成功创建了目标文件,但在我尝试 link目标文件添加到名为 vdpsodex.F
的主堡垒运行 脚本中,并创建 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.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\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\mex_7FJjxb\vdpsodex.obj sodex.obj decsol.obj
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00068.o):(.idata+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib'
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00086.o):(.idata+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib'
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00062.o):(.idata+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib'
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00157.o):(.idata+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib'
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00161.o):(.idata+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\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 创建的选项文件对完全相同的文件进行了 MEX,并且完全没有问题。我只是注意到,因为我不久前更改了我的 MinGW 构建,即使我重新创建了选项文件 (mexopts_f77.bat
),我也无法再对相同的 Fortran 文件进行 MEX 处理 (mexopts_f77.bat
)。
总之,长话短说,我发现这个 link 非常有用。基本上,它建议下载五个包并将它们解压缩到 MinGw 的根目录。其中四个 link 还活着。其中一个已经死了,但我通过谷歌搜索包名找到了它。您在下面看到的是更新后的 link 包。
最后但同样重要的是,如果您的 g77 无法使用 Gnumex 制作的选项文件,这里是解决方案:
- 下载以下软件包:
- 将它们解压到您的 MinGW 根目录,例如
C:\MinGW
- 通过选择 Fortran 77 作为编译语言重新制作您的选项文件,例如
mexopt_f77.bat
使用以下语法的 MEX Fortran 脚本。
mex -f [options-file] [fortran-file.f]
如果您需要 link 一些文件到主脚本,那么您必须先将它们编译为目标文件,然后 link 它们。
mex -f [options-file] -c [linkfile1.f] [linkfile2.f]
mex -f [options-file] [fortran-file.f] [linkfile1.obj] [linkfile2.obj]
我最近 运行 遇到了一个问题。据我所知,它曾经工作得很好,但几周后我再次尝试在 MATLAB 中 MEX 一个 fort运行 77 文件,但它给了我一个奇怪的错误。
好的,我使用名为 mexopts_f77.bat
的 Gnumex 创建了 MEX 选项文件。
这是我在 MATLAB 中 运行 的命令:
mex -v -f C:\Omid\Other\Gnumex\mexopts_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
并成功创建了目标文件,但在我尝试 link目标文件添加到名为 vdpsodex.F
的主堡垒运行 脚本中,并创建 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.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\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\mex_7FJjxb\vdpsodex.obj sodex.obj decsol.obj
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00068.o):(.idata+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib'
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00086.o):(.idata+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib'
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00062.o):(.idata+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib'
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00157.o):(.idata+0x0): undefined reference to `_head_C__Omid_Other_Gnumex_libs_flibmx_lib'
C:\Omid\Other\Gnumex\libs/flibmx.lib(ds00161.o):(.idata+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\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 创建的选项文件对完全相同的文件进行了 MEX,并且完全没有问题。我只是注意到,因为我不久前更改了我的 MinGW 构建,即使我重新创建了选项文件 (mexopts_f77.bat
),我也无法再对相同的 Fortran 文件进行 MEX 处理 (mexopts_f77.bat
)。
总之,长话短说,我发现这个 link 非常有用。基本上,它建议下载五个包并将它们解压缩到 MinGw 的根目录。其中四个 link 还活着。其中一个已经死了,但我通过谷歌搜索包名找到了它。您在下面看到的是更新后的 link 包。
最后但同样重要的是,如果您的 g77 无法使用 Gnumex 制作的选项文件,这里是解决方案:
- 下载以下软件包:
- 将它们解压到您的 MinGW 根目录,例如
C:\MinGW
- 通过选择 Fortran 77 作为编译语言重新制作您的选项文件,例如
mexopt_f77.bat
使用以下语法的 MEX Fortran 脚本。
mex -f [options-file] [fortran-file.f]
如果您需要 link 一些文件到主脚本,那么您必须先将它们编译为目标文件,然后 link 它们。
mex -f [options-file] -c [linkfile1.f] [linkfile2.f]
mex -f [options-file] [fortran-file.f] [linkfile1.obj] [linkfile2.obj]