xcode - Error de compilación de MEX: nombre de tipo desconocido ''char16_t''
matlab c++11 (7)
Acabo de agregar mi propio experimento (solo C ++). los
#define char16_t uint16_t
estaba causando algún problema en las otras partes del archivo mex. De hecho, luego de mi archivo mex, char16_t
fue definido correctamente. Al rastrear la cadena de char16_t
, el tipo apropiado char16_t
se establece en un archivo llamado __config
:
typedef __char16_t char16_t;
que es también el primer archivo incluido desde <algorithm>
. Entonces el truco consiste en incluir algorithm
antes de mex.h
#include <algorithm>
#include "mex.h"
y se realizan las configuraciones adecuadas, aún de forma multiplataforma y sin cambiar nada en la configuración de compilación.
No puedo compilar ningún código MATLAB MEX debido al siguiente 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;
Lo único que ha cambiado en mi máquina por lo que puedo recordar es que Xcode se actualizó a la versión 5.1 (5B130a).
¿Alguna solución por el momento para compilar el código MEX en MATLAB?
[Ejecutando en OS 10.9.2 con Apple LLVM versión 5.1 (clang-503.0.38) (basado en LLVM 3.4svn)]
Como parte de XCode 5.1.1 char16_t
se define en __config
, que se llama desde typeinfo
.
Puedes añadir
#include <typeinfo>
antes de
#include "mex.h"
tener char16_t
definido.
De forma predeterminada, Clang actualizado no establece char16_t
, que es requerido por MATLAB.
Arreglo rapido
Esto funciona para el código C o C ++, pero debe hacerse en cada línea de comando mex
.
>> mex -Dchar16_t=uint16_t ...
Otras soluciones a continuación ponen esta definición en la configuración mex o habilitan C ++ 11.
Solución permanente
Opciones:
- Agregue
-std=c++11
aCXXFLAGS
en su archivo de configuración mex Y compile archivos .cpp en lugar de .c. El archivo mex config es mexopts.sh (pre-R2014a) o el archivo .xml indicado pormex -setup
(R2014a +). Esto es lo que funcionó para OP, pero la siguiente opción también funciona. Asegúrese de editar la configuración activa / instalada, no la referencia de todo el sistema. Prueba la siguiente solución si no puedes decirlo. - Use un
#define
otypedef
para crearchar16_t
antes de incluir mex.h (consulte "otra solución alternativa" a continuación). - En alguna versión futura de MATLAB, esto se habrá solucionado. Vuelva a ejecutar
mex -setup
para que MATLAB lo reconfigure y funciona. A partir de R2014a, esto no funciona. - Como último recurso, siempre puede modificar la instalación de MATLAB, pirateando tmwtypes.h de MATLAB como sugiere Dennis, pero le sugiero que NO modifique la instalación de MATLAB.
Nota: Si está utilizando C y no puede o no quiere cambiar a C ++, siga la solución en esta otra respuesta , O vea la solución alternativa a continuación.
La otra solución
Si por alguna razón no puede habilitar el estándar C ++ 11, puede usar el preprocesador para definir char16_t
. #define char16_t uint16_t
antes #include "mex.h"
, o #include "mex.h"
con la línea de comando del compilador:
-Dchar16_t=uint16_t
Alternativamente, use un typedef
, nuevamente antes de incluir mex.h:
typedef uint16_t char16_t;
Si estas soluciones no funcionan, intente cambiar uint16_t
a UINT16_T
. Aún más, otros han informado que simplemente incluir uchar.h trae el tipo, pero otros no tienen ese encabezado.
Esta publicación podría ayudar: http://www.seaandsailor.com/matlab-xcode6.html
Fue más fácil de lo que pensaba. Simplemente reemplace todos los 10.x con su versión OS X y agregue -Dchar16_t=UINT16_T
a CLIBS
en el archivo mexopts.sh
.
Funcionó en OS X 10.9 Mavericks con Xcode 6 instalado.
Experimenté el mismo error, también directamente después de actualizar a Xcode 5.1.
Las líneas relevantes (818-824) en el archivo tmwtypes.h, que causa el error, son:
#if defined(__STDC_UTF_16__) || (defined(_HAS_CHAR16_T_LANGUAGE_SUPPORT) && _HAS_CHAR16_T_LANGUAGE_SUPPORT)
typedef char16_t CHAR16_T;
#elif defined(_MSC_VER)
typedef wchar_t CHAR16_T;
#else
typedef UINT16_T CHAR16_T;
#endif
Una solución es simplemente cambiar la línea
typedef char16_t CHAR16_T;
dentro
typedef UINT16_T CHAR16_T;
A debe admitir que no sé si esto afecta a alguna función o comportamiento de los archivos mex pero al menos puedo compilar mis archivos c nuevamente usando mex.
Incluir uchar.h antes de incluir mex.h ... funciona bien. Además, la respuesta anterior (sumando -std = c ++ 11) solo funciona para c ++, no para c.
#include <uchar.h>
#include "mex.h"
Por favor vea otras respuestas si este método no funciona.
Actualicé mis compiladores gcc / g ++ usando homebrew a la versión 4.8 -> gcc-4.8
y g++-4.8
.
Después de eso, cambié las siguientes líneas en el archivo mexopts.sh:
CXXFLAGS="-fno-common -fexceptions -arch $ARCHS -isysroot $MW_SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET -std=c++11"
En mi mexopts.sh, esta es la línea 150. Solo agregué la -std=c++11
que es lo que supongo que significa chappjc.
EDITAR: ¡Esto está cubierto en la actualización por chappjc!