3 回答
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文件转换。
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的二进制代码生成速度稍快)。有关详细信息和下载,请参见我的主页。
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++
- 3 回答
- 0 关注
- 1915 浏览
添加回答
举报