在 64 位 Windows 7 机器上使用 GCC 作为 MATLAB 2014a 的默认 MEX 编译器
Posted
技术标签:
【中文标题】在 64 位 Windows 7 机器上使用 GCC 作为 MATLAB 2014a 的默认 MEX 编译器【英文标题】:Use GCC as the Default MEX Compiler for MATLAB 2014a on a 64 bit Windows 7 machine 【发布时间】:2014-10-15 21:56:18 【问题描述】:我正在寻找一种在 Windows 7 计算机上编译 Unix MEX 文件的简单方法。
MEX 文件在 Mac OS X 10.9 上的 MATLAB 2014a 中顺利编译(使用“XCode with Clang”作为编译器)。但是,与我一起工作的一些人在使用 Windows 7.1 SDK 中的 C 编译器在 Windows 7 中编译它们时遇到了麻烦。
我知道,如果我在 MATLAB 中使用 GCC 编译 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" 选项很重要。
【问题讨论】:
好的,但是您是否尝试过该问题中建议的任何解决方案?如果是这样,问题是什么? @Amro 是的!我首先尝试了this 解决方案,但实际上最终破坏了 MATLAB MEX 安装程序(我怀疑是因为 gnumex 太旧了)。我也尝试过适配this solution,但是在目录中找不到mexopts.bat文件。我认为值得提出一个新问题,因为设置在很多方面都不同/已经有足够的时间出现新的解决方案。 好的,我发布了一些关于 MinGW-w64 的说明。但是使用免费的 Windows SDK 也同样简单(也许更容易,因为mex -setup
可以开箱即用地检测到它)。
【参考方案1】:
首先下载 MinGW-w64 编译器工具链。我们将使用 x64 版本。这是截至目前(GNU GCC 4.9.1)的latest binaries 的链接。
将 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 文件的依赖项(诸如 libstdc++ 之类的东西) .使用Dependency Walker 工具将它们全部列出。
【讨论】:
注意:mexopts.bat
文件从 R2014a 开始已被弃用,预计将在未来版本中删除,以支持 XML 配置文件。
非常感谢。此设置可以很好地编译“yprime.c”。但是,它不能编译我以前的 C 代码(在 UNIX / Mac OS X 中编译得很好)。我想我只是想确保使用 gcc/MinGW 编译并不总是有效(以排除愚蠢的错误)。
@BerkU.: 假设您只使用标准 C/C++,它应该可以正常编译(一些 POSIX 的东西不能移植到 Windows,在这种情况下,您必须找到 Win32 的等价物并使用#if/#else
围绕特定平台功能的宏)以上是关于在 64 位 Windows 7 机器上使用 GCC 作为 MATLAB 2014a 的默认 MEX 编译器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 7 64 位机器上为 anaconda 的 python 3.5 安装 cvxopt?
Delphi 在 Windows 7 64 上使用 LockFile
在 64 位 Windows 7 上安装 Visual Studio 2003
适用于 64 位 Windows 7 的廉价 Windows 驱动程序签名