I cannot compile any MATLAB MEX code due to the following error:
In file included from /Applications/MATLAB_R2013a.app/extern/include/mex.h:58:
In file included from /Applications/MATLAB_R2013a.app/extern/include/matrix.h:294:
/Applications/MATLAB_R2013a.app/extern/include/tmwtypes.h:819:9: error: unknown type name 'char16_t'
typedef char16_t CHAR16_T;
The only thing that has changed on my machine as far as I can remember is that Xcode was updated to version 5.1 (5B130a).
Any fix for the time being to compile MEX code in MATLAB?
[Running on OS 10.9.2 with Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)]
I experienced the same error, also directly after upgrading to Xcode 5.1.
The relevant lines (818-824) in the file tmwtypes.h, which causes the error, are:
A solution is to simply change the line
into
A must admit that I don't know if this affects any function or behaviour of mex files but at least I'm able to compile my c files again using mex.
Include uchar.h before including mex.h...works fine. Also, the answer above (adding -std=c++11) only works for c++, not c.
This post might help: http://www.seaandsailor.com/matlab-xcode6.html
It was easier than I thought. Just replace all 10.x with your OS X version and add
-Dchar16_t=UINT16_T
toCLIBS
inmexopts.sh
file.It worked on OS X 10.9 Mavericks with Xcode 6 installed.
Please see other answers if this method doesn't work.
I upgraded my gcc/g++ compilers using homebrew to version 4.8 -->
gcc-4.8
andg++-4.8
.After that I changed the following lines in the mexopts.sh file:
In my mexopts.sh, this is line 150. I only added the
-std=c++11
flag which is what I guess chappjc meant.EDIT: This is covered in the update by chappjc!
As part of XCode 5.1.1
char16_t
is defined in__config
, which is called fromtypeinfo
.You can add
before
to have
char16_t
defined.By default, the upgraded Clang doesn't set
char16_t
, which is required by MATLAB.Quick fix
This works for C or C++ code but needs to be done on each
mex
command line.Other solutions below put this definition into the mex configuration or enable C++11.
Permanent solution
Options:
-std=c++11
toCXXFLAGS
in your mex configuration file AND compile .cpp files instead of .c. The mex config file is mexopts.sh (pre-R2014a) or the .xml file indicated bymex -setup
(R2014a+). This is what worked for OP, but the next option works too. Be sure to edit the active/installed config, not the system-wide reference. Try the next solution if you can't tell.#define
ortypedef
to createchar16_t
before including mex.h (see "other workaround" below).mex -setup
to have MATLAB reconfigure it for you and it works. As of R2014a, this doesn't do the trick.Note: If you are using C and cannot or don't want to change to C++, follow the solution in this other answer, OR see the alternative workaround below.
The other workaround
If for some reason you are not able to enable the C++11 standard, you can use the preprocessor to define
char16_t
. Either put#define char16_t uint16_t
before#include "mex.h"
, or set it with the compiler command line:Alternatively, use a
typedef
, again before including mex.h:If these solutions don't work, try changing
uint16_t
toUINT16_T
. Further yet, others have reported that simply including uchar.h brings in the type, but others don't have that header.