【问题标题】:Use GCC as the Default MEX Compiler for MATLAB 2014a on a 64 bit Windows 7 machine在 64 位 Windows 7 机器上使用 GCC 作为 MATLAB 2014a 的默认 MEX 编译器
【发布时间】: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 可以开箱即用地检测到它)。

标签: c windows matlab gcc mex


【解决方案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 围绕特定平台功能的宏)
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2012-01-18
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 2012-06-09
相关资源
最近更新 更多