编译器:Microsoft Windows SDK 7.1(C/C++) 和 GNU编译器(有MinGW(Minimalist GNU for Windows,仅32位)、MinGW64(64位和32位)、TMD-GCC(非官方的编译器包)、CygWin等等,它们间的区别与联系参见GCC_Cygwin_MinGW_TDM-GCC) 0 R0 k, k+ Z# [) i2 E3 f) I
( N7 _6 [# r( u+ B1 l3 X
% P1 o9 N/ S* ~3 v$ r
! z8 ]2 [4 _' x/ X) h m3 I
Matlab混合编程 * Z7 ?, I! W( S3 I$ R5 [下载与安装编译器4 F. o* Q% ?6 l# p( W! l& a* A
Microsoft Windows SDK 7.1(C/C++); _- v4 _0 S5 b8 t
点此Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO)打开下载页面,是镜像文件,选择64-bit版,文件大小500M+,全部安装需占磁盘近2G。 / D- E8 _* X" u % p. I! d4 [, H9 U5 K下载完成后根据提示安装即可,如果出现问题,安装失败,参考:Problem&Solution 部分。$ J; g: B5 Y7 O6 ?; |$ q" ~* R2 l
' h7 K* k/ z" o9 J+ e) y4 t
TDM-GCC(gcc/g++) - E8 |7 \& {7 I7 KFor Matlab 2015+ F0 |- v0 ? ]& V& v
Matlab 2015已经开始支持GNU编译器,具体参见:Supported and Compatible Compilers for R2015b,安装方法参见:Install MinGW-w64 Compiler。7 ?9 d/ Z; |9 A* a
7 H4 d2 l0 A1 N; i) ?
注意,MATLAB 2015现仅支持GCC4.9.2,在安装TMD-GCC时,不要勾选更新,如下图: # E9 v# X! M2 s
" p" f# b j# |4 r* V) @ ! W5 o5 ^& D8 k8 }9 n最后的战斗: , k% ?! t4 [7 K3 W% z3 i/ P6 W因为Matlab不支持GNU的编译器,还得做点事,下面的方法来自Using GCC (MinGW) as MATLAB’s MEX compiler 中的Bogdan的解答:# z5 F/ U) g$ S% W1 e
% A1 _9 j+ N& Z( c! u& H( j0 _
下面的代码是从Bogdan主页上下载的mexopts.bat文件代码,使用时需要做一点小小的改动。 ; H: }: C. `4 N [3 I* w. i, K5 } 5 U) F; _. v+ E h在下面的代码中找到:set MINGWPATH=p:\mingw64这句代码,将其中的路径p:\mingw64替换成你的TMD-GCC-64的安装目录,如我的是:E:\devtools\TDM-GCC-64,然后保存并将mexopts.bat文件copy到计算机如下路径(复制下面的路径地址,粘贴到资源管理器窗口地址栏,回车即可): 6 p0 h( e, p9 K 6 a& y. ?+ V0 ^6 L%USERPROFILE%\AppData\Roaming\Mathworks\MATLAB\R2014a\$ v/ U9 `) |7 \8 t) |& P
+ X% D! s: _0 `& v1 k/ t下面是代码: " y/ Q% A1 y3 K( F/ {0 A2 h. A; s; {, B! A; B. t) @9 V& R; l @Echo off 8 l& t* E$ C+ S9 I6 h$ k% x8 K: D1 ~3 x
:: NOTE: this is actually not a proper .bat file executed by Windows. MEX5 d8 o: O+ Z; M7 p7 @
:: parses it and only understands a very reduced set of commands:% r2 T# R( L9 q- G, k. Z. u. }
:: "set" and "rem" apparently, everything else is ignored (behaves as3 k( |# R8 V5 v
:: "rem"), so don't do any fancy batch stuff in here. There are some # j! R* q0 f2 N: z:: undocumented special vars you can set here that will trigger MEX ; _6 C) f8 @) {' m:: to do fancy stuff.' u* b) q) Y& r% |3 R- v. V. B
' c/ [0 y0 r/ |6 N$ ^8 V0 Q
:: You can use MinGW64 builds (win32 threads + seh unwinding) from here: & s/ Z5 b* o9 R% I; s8 \:: http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/ 1 N/ J; k: |' ^7 Q! c' C 2 z6 d) u$ s5 ?. I% F: `9 G( X; c:: Tested with the following: 8 j6 u" n7 X3 }:: http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.9.1/threads-win32/seh/x86_64-4.9.1-release-win32-seh-rt_v3-rev1.7z! C+ u( k- w, R# {, [7 w! n
9 {( u k, ]/ y- T) g
:: Set this to your Mingw64 top folder, where you extracted the above @. a( W6 i8 u cset MINGWPATH=p:\mingw64 5 Q( P5 C3 ^( { 3 ^* n, F1 M+ n5 V) {7 H! L" v:: Leave these alone unless you know what you're doing. p: L% \& i; u! sset PATH=%MINGWPATH%\bin;%PATH%7 m0 z, `$ p ~
set PRELINK_CMDS=echo.>%TEMP%\mexstaticlibs5 }& d8 r2 a; {6 B, f
4 K* c2 ]5 q2 E* H- A
:: You can have MEX run some commands before calling the linker.7 g4 u. M$ J2 h1 A- m& g$ _
:: The two examples below will cause gcc to output the full path to some 4 I1 Y6 m9 A B! g6 n) M:: static libraries so you can link statically to them (see the/ n q7 m8 h+ z% }# S5 l& U
:: LINGFLAGSPOST special var below). You can set any command here, however. 4 C6 X; f- S- `& W- urem set PRELINK_CMDS1=gcc -print-file-name=libwinpthread.a >> %TEMP%\mexstaticlibs) Y, g7 P' j# f. ?
rem set PRELINK_CMDS2=gcc -print-file-name=libquadmath.a >> %TEMP%\mexstaticlibs 6 `2 ^1 p5 }) c+ Prem set PRELINK_CMDS3=... + e6 P0 h" X8 G) m 2 {9 v$ _( n* g8 J3 q2 k; Q:: You can have MEX run some commands also after calling the linker& h! H& _- F2 Y+ ~# n; z
:: (e.g. upx compress the output .mex)/ p# t/ b4 Y- f; m0 v
rem set POSTLINK_CMDS1=upx -9 "%OUTDIR%%MEX_NAME%%MEX_EXT%" ! g3 N' p! D9 C- e" n3 k" t5 qrem set POSTLINK_CMDS2=...5 g$ V3 v( \0 h" X& T; J2 w
( e1 q5 `& @+ H8 r9 G3 M
:: You can change these if you really need to.0 ^& h7 e% D) S5 u
set COMPILER=g++# P& Z- ^ |2 m2 h% Q" A3 \
set COMPFLAGS=-c -I"%MATLAB%\extern\include" -DMATLAB_MEX_FILE 3 h, f% L$ v; } g& p7 H0 _set OPTIMFLAGS=-O3 -funroll-loops -DNDEBUG1 l3 f7 |( Z7 E; A: P i
set DEBUGFLAGS=-g . X- B6 S2 w# l2 E M1 `' B% }set NAME_OBJECT=-o ! s" Y% R9 P7 K A* J6 P $ j% z" Z! E) Y) n1 _" Cset LINKER=g++ Q- k$ F( S h2 \0 w
set LINKFLAGS=-shared -static-libstdc++ -static-libgcc -L"%MATLAB%\bin\win64" -L"%MATLAB%\extern\lib\win64\microsoft" -lmex -lmx -leng -lmat -lmwlapack -lmwblas3 L+ b0 e G2 s" V: S2 ?
' ]3 z3 L, x8 Z, V3 N) \
set LINKFLAGSPOST=@%TEMP%\mexstaticlibs& F. r# G% I! G8 l) t h
set NAME_OUTPUT=-o "%OUTDIR%%MEX_NAME%%MEX_EXT%", u4 |6 V0 {1 Z6 ?& F [2 A7 b9 h
4 P& r. X h. i - } \; k: h/ j& X% ]$ z' |:: EXAMPLES 3 a. ]) a! \) W" D& {:: ======== * @9 |9 T- P. D- V0 S) w e" R9 v9 O0 {' L
:: You can compile simple files using "mex file.cpp". To support more than 2^32 elements, use/ h0 x" k. B0 T/ E9 H
:: "mex -largeArrayDims file.cpp" ... use this by default, unless you know what you're doing. $ b0 L/ }2 T3 ]% w. N7 B- J1 r% \- {; t; S4 a
:: To add include dirs, lib dirs, or compile/link flags, do: % E; ]' W# S/ ^:: mex COMPFLAGS="$COMPFLAGS -std=gnu99 -Ix:/include/dir" LINKFLAGS="$LINKFLAGS -Lx:/libs/dir -lmylib" -largeArrayDims file.cpp$ {+ ?) m4 ]. Y1 V3 N# _( R
0 x; n7 ~' u: a% `* V" e: I* q! P+ m M3 p0 H% l1 u
选择编译器 & T& E- }% |9 k/ O( \2 r& l
查看可用编译器:使用mex -setup查看可选择的编译器,如果没有需要自己安装,如果已安装且只安装了编译器Microsoft Windows SDK 7.1(C/C++),显示如下结果: 6 B. _7 z/ G H! O( m" M" t0 c