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++11aCXXFLAGSen 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
#defineotypedefpara crearchar16_tantes 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 -setuppara 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!