我正在寻找一种在Windows7计算机上编译Unix MEX文件的简单方法。
MEX文件在macosx10.9上的MATLAB 2014a中顺利编译(使用“XCode with Clang”作为编译器)。不过,与我一起工作的一些人在使用Windows 7.1sdk中的C编译器在windows7中编译时遇到了问题。
我知道,如果使用GCC在MATLAB中编译MEX文件,我可能可以避免这些错误。我想知道是否有人知道怎么做。我很乐意下载和编辑任何必要的文件,以便a)使用“MEX”命令在MATLAB中编译MEX文件,b)确保“-I”和“-L”指令也将传递给MEX编译器。
注意,我的问题与to this post from 2+ years ago非常相似。也就是说,自从a)MATLAB/MinGW/MEX发布了一个新的帖子以来,我已经发布了一个重要的更新(甚至不确定MinGW是否是摆脱这一混乱的最简单方法);b)有一个64位的东西(不确定它是否有问题);c)选项“-I”和“-L”很重要。
最佳答案
从下载MinGW-w64编译器工具链开始。我们将使用x64版本。这是到目前为止latest binaries的链接(GNU GCC 4.9.1)。
将7z存档文件提取到某个位置(最好没有空格),例如C:\MinGW-w64\mingw64
。
将bin
文件夹添加到PATH环境变量中,这样就可以在系统范围内执行set PATH=C:\MinGW-w64\mingw64\bin;%PATH%
操作。
创建以下文件(如果您需要C++ 11的支持,请随意添加编译器开关,如-std=c++11
):
mexopts_mingw64.bat公司
@echo off
set MATLAB=%MATLAB%
set MW_TARGET_ARCH=win64
set MINGWROOT=C:\MinGW-w64\mingw64
set PATH=%MINGWROOT%\bin;%PATH%
set COMPILER=x86_64-w64-mingw32-g++
set COMPFLAGS=-c -m64 -mwin32 -mdll -Wall -DMATLAB_MEX_FILE
set OPTIMFLAGS=-DNDEBUG -O2
set DEBUGFLAGS=-g
set NAME_OBJECT=-o
set LINKER=x86_64-w64-mingw32-g++
set LIBLOC=%MATLAB%\extern\lib\%MW_TARGET_ARCH%\microsoft
set LINKFLAGS=-shared -L"%LIBLOC%" -L"%MATLAB%\bin\%MW_TARGET_ARCH%"
set LINKFLAGSPOST=-lmx -lmex -lmat
set LINKOPTIMFLAGS=-O2
set LINKDEBUGFLAGS=-g
set LINK_FILE=
set LINK_LIB=
set NAME_OUTPUT=-o "%OUTDIR%%MEX_NAME%%MEX_EXT%"
set RC_COMPILER=
set RC_LINKER=
现在我们使用它来编译一个示例MEX文件:
>> mex -f mexopts_mingw64.bat -v -largeArrayDims "C:\Program Files\MATLAB\R2014a\extern\examples\mex\yprime.c"
>> yprime(1,1:4)
ans =
2.0000 8.9685 4.0000 -1.0947
注意:如果您正在编译C++代码,并且希望将二进制文件分发给其他人,那么您可能还需要包含来自MinGW的两个DLL文件,这些文件将是编译的MEX文件(像LISSTDC++ +的东西)的依赖。使用Dependency Walker工具列出它们。