为了账号安全,请及时绑定邮箱和手机立即绑定

使用GCC(MinGW)作为MATLAB的MEX编译器

使用GCC(MinGW)作为MATLAB的MEX编译器

月关宝盒 2019-11-13 14:24:34
我得到了一个在MATLAB R2011a上运行的项目。由于其中存在多个.c文件-我需要将GCC设置为该项目的MEX编译器。但是,我似乎找不到任何有关如何设置它的解释。我尝试了一个名为gnumex的脚本程序-但失败了(可能是为旧版本的MATLAB设置的)。知道如何设置吗?
查看完整描述

3 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

在Matlab 2011b中,只需在mingw64或cygwin环境中直接编译和链接即可。


MINGWPATH=c:/MinGW64

CYGPATH=c:/cygwin


MATLABROOT=c:/Progra~1/MATLAB/R2011b

CC=$(MINGWPATH)/bin/x86_64-w64-mingw32-gcc 

CFLAG= -Wall -m64 -O3 -I$(MATLABROOT)/extern/include $(SRC) $(LIBS) -o $(EXE)

MEXFLAG=-m64 -shared -DMATLAB_MEX_FILE -I$(MATLABROOT)/extern/include -Wl,--export-all-symbols $(LIBS) $(MEXSRC) -o $(MEXTGT).mexw64


LIBS= -L$(MATLABROOT)/bin/win64 -L$(MATLABROOT)/extern/lib/win64/microsoft -lmex -lmx -lmwlapack -lmwblas -leng

EXE=../bin/engwindemo.exe

MEXTGT=

SRC=engwindemo.c

MEXSRC=

all:$(EXE)


$(EXE):  $(SRC)

    $(CC) $(CFLAG) -ladvapi32 -luser32 -lgdi32 -lkernel32 -lmingwex -o $(EXE)

    @rm -f *.o*


$(MEXTGT):  $(MEXSRC)

    $(CC) $(MEXFLAG) -ladvapi32 -luser32 -lgdi32 -lkernel32 -lmingwex 

    @rm -f *.o*

将此makefile放在源代码目录和上make。无需dll文件转换。


查看完整回答
反对 回复 2019-11-13
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

为什么不调整目录中的mexopts.bat文件?这样,您可以像在MATLAB中一样,透明地使用“ mex”命令来编译任何内容,就像通过MATLAB使用来配置一样mex -setup。我很惊讶以前没有人这样做。


以下文件适用于x64版本的Matlab和Mingw。我正在使用TDM Mingw64发行版,该发行版安装在中p:\mingw64-tdm。我已经安装了p:\matlab\R2012aMatlab-进行相应编辑。


这是我正在使用的mexopts.bat文件,请将其复制粘贴到%USERPROFILE%\AppData\Roaming\MathWorks\MATLAB\R2012a\mexopts.bat:


@echo off


set MINGWPATH=p:\mingw64-tdm

set PATH=%MINGWPATH%\bin;%PATH%


set COMPILER=gcc

set COMPFLAGS=-c -m64 -I"%MATLAB%\extern\include" -DMATLAB_MEX_FILE -Wall -std=c99

set OPTIMFLAGS=-O3 -DNDEBUG

set DEBUGFLAGS=-g

set NAME_OBJECT=-o


set LINKER=gcc

set LINKFLAGS=-shared -L"%MATLAB%\bin\win64" -L"%MATLAB%\extern\lib\win64\microsoft" -lmex -lmx -leng -lmat -lmwlapack -lmwblas

set NAME_OUTPUT=-o "%OUTDIR%%MEX_NAME%%MEX_EXT%"

然后,您可以尝试在Matlab中执行以下操作:


mex -v p:\matlab\R2012a\extern\examples\mex\yprime.c

which yprime

应该产生b:\code\m\yprime.mexw64(或任何当前文件夹)。然后,如果您这样做:


yprime(1,1:4)

您应该看到:


ans =

    2.0000    8.9685    4.0000   -1.0947

这意味着您在做生意。祝好运!


编辑2014年10月:我现在使用比上面改进的mexopts.bat文件,使用不同的MinGW64(比TDM的二进制代码生成速度稍快)。有关详细信息和下载,请参见我的主页。


查看完整回答
反对 回复 2019-11-13
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

从MATLAB R2015b开始,已正式支持MinGW!

现在,它在受支持的编译器列表的顶部。


有关下载MinGW 的官方说明,请参见此处(他们建议使用TDB-GCC)。


有列出了一些限制和警告(如不与其他编译器编译库的链接,你必须抓住MEX文件中的例外,等等)。


下面是我制作XML文件以执行相同操作的旧方法。


过去的岁月已经过去,MATLAB(从R2014a开始)已转移到用于配置MEX文件的基于XML的新系统。目前,MATLAB仍暂时支持旧版.bat文件,但它会困扰您。另一个变化是不同的C和C ++配置(稍后会有更多介绍)。


保持不变的是,您只需要下载并提取MinGW发行版并将MATLAB指向它。目前还没有必要MSYS,Cygwin的或gnumex。唯一棘手的部分是将MATLAB指向它,但这是一个解决方案。


简洁版本


下载并提取MinGW发行版。选择一个,例如MinGW-w64(64位)或TDM-GCC(32位和64位选项)。

使用该模板作为模板来定制XML配置文件(详细信息请参见下面的长版)。

设置MINGWROOT环境变量。

运行mex -setup:[xmlfile] [C|C++]。

长版


对于MinGW-w64,我执行以下操作进行设置:


从Sourceforge获取w64的最新版本(或使用安装程序选择所需的工具链,根据需要选择pthread或Win32线程版本)。

提取它,以便您有一个类似于的编译器路径C:\mingw-w64\x86_64-4.9.2-release-posix-seh-rt_v3-rev1\bin\x86_64-w64-mingw32-g++.exe。 如果您打算使用mex命令在MATLAB中进行编译,则不需要MSYS,cygwin或任何其他环境。检查PATH环境变量,以确保g++路径上没有多个编译器(),最好没有。使用全新的命令提示符进行验证。

使用自定义XML配置文件进行设置。在我的GitHub存储库上,我以两种文件类型发布了MinGW-w64的C ++配置:mex_C ++ _ mingw-w64.xml和旧版mingw_mexopts.bat。从此作为模板开始,并(可选)使用您下载和提取的MinGW发行版的描述性名称和版本来编辑XML文件。

设置(或创建)MINGWROOT环境变量。这就是允许mex命令找到编译器的原因。您可以在MATLAB中(并且每次 MATLAB以其中的startup.m脚本开头userpath)都可以执行此操作setenv,或者使用Windows属性对话框或本机Windows 7 setx.exe命令仅执行一次。

运行mex -setup:C:\actual\configFilePath.xml C++。例如,使用.xml文件设置C ++ MEX文件编译:


setenv('MINGWROOT','H:\mingw-w64\x86_64-4.9.2-release-posix-seh-rt_v3-rev1')

mex -setup:H:\building\GitHub\MATLAB\MinGW\mex_C++_mingw-w64.xml C++

输出应如下所示:


MEX配置为使用“ MinGW-w64 GCC 4.9.2 posixthreads seh”进行C ++语言编译。


如果需要,以类似的方式使用指定C语言的新XML配置文件设置C编译器,即C编译器前端(例如“ x86_64-w64-mingw32-gcc.exe”,该文件不会自动链接C ++标准库) ),根据需要调整链接库,编译器标志(例如,更改-std=c++11为-std=c99)等。


关于运行时库的静态链接与动态链接的说明


像上面这样用MinGW-w64创建的MEX文件之类的库,可能取决于一些DLL(在运行时):LIBGCC_S_SEH-1.DLL(用于seh例外发行版)和LIBSTDC ++-6.DLL,可能还包括libwinpthread-1.dll。如果选择的是pthreads发行版而不是Win32线程。如果您不想复制这些文件,则可以通过添加以下开关将运行时库静态链接到MEX文件中:


-static-libgcc -static-libstdc++

XML模板中对此有一个注释。有关libpthread-1.dll的信息,请参见此处。


对于TDM-GCC,情况恰恰相反:运行时(包括pthread)是自动静态链接的。若要动态链接,这将需要DLL,但会减小MEX文件的大小,您需要:


-shared-libgcc -shared-libstdc++


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 1897 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信