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)]
Par défaut, Clang mis à niveau ne définit pas char16_t
, requis par MATLAB.
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.
Options:
-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.#define
ou typedef
pour créer char16_t
avant d'inclure mex.h (voir "autre solution de contournement" ci-dessous).mex -setup
pour que MATLAB le reconfigure pour vous et que cela fonctionne. À partir de R2014a, cela ne fait pas l'affaire.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_t
avant#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.
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.
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!
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.
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.
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é.
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"