xcode matlab c++11 compiler-errors mex

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 a CXXFLAGS 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 por mex -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 o typedef para crear char16_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!