web-dev-qa-db-fra.com

Erreur de compilation MEX: nom de type inconnu 'char16_t'

Je ne peux pas compiler de code MATLAB MEX en raison de l'erreur suivante:

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;

La seule chose qui a changé sur ma machine pour autant que je puisse m'en souvenir est que Xcode a été mis à jour vers la version 5.1 (5B130a).

Un correctif pour le moment pour compiler le code MEX dans MATLAB?

[Fonctionnant sous OS 10.9.2 avec Apple LLVM version 5.1 (clang-503.0.38) (basé sur LLVM 3.4svn)]

21
p0lAris

Par défaut, Clang mis à niveau ne définit pas char16_t, requis par MATLAB.

Solution rapide

Cela fonctionne pour le code C ou C++, mais doit être effectué sur chaque ligne de commande mex.

>> mex -Dchar16_t=uint16_t ...

D'autres solutions ci-dessous introduisent cette définition dans la configuration mex ou activent C++ 11.

Solution permanente

Options:

  • Ajoutez -std=c++11 à CXXFLAGS dans votre fichier de configuration mex ET compilez les fichiers .cpp à la place de .c. Le fichier de configuration mex est mexopts.sh (pré-R2014a) ou le fichier .xml indiqué par mex -setup (R2014a +). C'est ce qui a fonctionné pour OP, mais l'option suivante fonctionne aussi. Assurez-vous de modifier la configuration active/installée et non la référence système. Essayez la solution suivante si vous ne le savez pas.
  • Utilisez un #define ou typedef pour créer char16_t avant d'inclure mex.h (voir "autre solution de contournement" ci-dessous).
  • Dans certaines versions futures de MATLAB, cela aura été corrigé. Réexécutez mex -setup pour que MATLAB le reconfigure pour vous et que cela fonctionne. À partir de R2014a, cela ne fait pas l'affaire.
  • En dernier recours, vous pouvez toujours modifier l’installation de MATLAB, en procédant au piratage des tmwtypes.h de MATLAB, comme le suggère Dennis, mais je suggère fortement que PAS modifie l’installation de MATLAB.

Remarque: Si vous utilisez C et que vous ne pouvez pas ou ne voulez pas passer à C++, suivez la solution proposée dans cette autre réponse , OR. Reportez-vous à la solution de contournement ci-dessous.


L'autre solution de contournement

Si, pour une raison quelconque, vous ne pouvez pas activer le standard C++ 11, vous pouvez utiliser le préprocesseur pour définir char16_t. Soit #define char16_t uint16_tavant#include "mex.h", ou définissez-le avec la ligne de commande du compilateur:

-Dchar16_t=uint16_t

Vous pouvez également utiliser typedef, à nouveau avant, y compris mex.h:

typedef uint16_t char16_t;

Si ces solutions ne fonctionnent pas, essayez de remplacer uint16_t par UINT16_T. De plus, d’autres ont signalé que le simple fait d’inclure uchar.h introduit le type, mais d’autres n’ont pas cet en-tête.

21
chappjc

J'ai rencontré la même erreur, également directement après la mise à niveau vers Xcode 5.1.

Les lignes pertinentes (818-824) du fichier tmwtypes.h, à l'origine de l'erreur, sont les suivantes:

#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

Une solution consiste simplement à changer de ligne 

typedef char16_t CHAR16_T;

dans

typedef UINT16_T CHAR16_T;

Je dois avouer que je ne sais pas si cela affecte les fonctions ou le comportement des fichiers mex, mais au moins je suis capable de compiler à nouveau mes fichiers c en utilisant mex.

8
Dennis

Veuillez voir d'autres réponses si cette méthode ne fonctionne pas.

J'ai mis à niveau mes compilateurs gcc/g ++ sous homebrew vers la version 4.8 -> gcc-4.8 et g++-4.8.

Après cela, j'ai modifié les lignes suivantes dans le fichier mexopts.sh:

CXXFLAGS="-fno-common -fexceptions -Arch $ARCHS -isysroot $MW_SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET -std=c++11"

Dans mon mexopts.sh, il s’agit de la ligne 150. Je n’ai ajouté que le drapeau -std=c++11 qui correspond à ce que je suppose que chappjc voulait dire.

EDIT: Ceci est couvert dans la mise à jour par chappjc!

2
p0lAris

Je viens d'ajouter ma propre expérience (C++ uniquement). le 

#define char16_t uint16_t 

causait un problème dans les autres parties du fichier mex. En fait, postérieurement à mon fichier mex, char16_t était correctement défini. En suivant la chaîne d'inclusions, le type approprié char16_t est défini dans un fichier nommé __config:

typedef __char16_t char16_t;

qui est également le premier fichier inclus à partir de <algorithm>. Donc, le hack consiste à inclure algorithm avant mex.h.

#include <algorithm>
#include "mex.h"

et les réglages appropriés sont effectués, toujours de manière multiplateforme et sans rien changer dans la configuration de construction.

2
Raffi

En tant que partie de XCode 5.1.1, char16_t est défini dans __config, qui est appelé à partir de typeinfo

Vous pouvez ajouter 

#include <typeinfo> 

avant 

#include "mex.h"

avoir char16_t défini.

0
Navid

Ce message pourrait aider: http://www.seaandsailor.com/matlab-xcode6.html

C'était plus facile que je pensais. Il suffit de remplacer toutes les versions 10.x par votre version OS X et d’ajouter -Dchar16_t=UINT16_T à CLIBS dans le fichier mexopts.sh.

Cela a fonctionné sur OS X 10.9 Mavericks avec Xcode 6 installé.

0
Palli Kominak

Inclure uchar.h avant d’inclure mex.h ... fonctionne bien. En outre, la réponse ci-dessus (ajout de -std = c ++ 11) ne fonctionne que pour c ++, pas c.

#include <uchar.h>
#include "mex.h"
0
tesch1