Ошибка компиляции MEX: неизвестное имя типа 'char16 t'

Я не могу скомпилировать код MATLAB MEX из-за следующей ошибки:

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;

единственное, что изменилось на моей машине, насколько я помню, это то, что Xcode был обновлен до версии 5.1 (5B130a).

любое исправление на данный момент для компиляции кода MEX в MATLAB?

[работает на ОС 10.9.2 с Apple LLVM версии 5.1 (clang-503.0.38) (на основе LLVM 3.4 svn)]

7 ответов


по умолчанию обновленный Clang не устанавливает char16_t, что требуется MATLAB.

быстро исправить

это работает для кода C или C++, но должно быть сделано на каждого mex командная строка.

>> mex -Dchar16_t=uint16_t ...

другие решения ниже помещают это определение в конфигурацию mex или включают C++11.

окончательное решение

варианты:

  • добавить -std=c++11 to CXXFLAGS в вашем файле конфигурации mex и компилировать.cpp-файлы вместо .c. Файл конфигурации mex mexopts.sh (pre-R2014a )или.XML-файл, указанный mex -setup (R2014a+). это то, что сработало для OP, но следующий вариант тоже работает. обязательно отредактируйте активную / установленную конфигурацию, а не общесистемную ссылку. Попробуйте следующее решение, если вы не можете сказать.
  • использовать #define или typedef создать char16_t перед включением mex.h (см. "другие обходные пути" ниже).
  • в некоторой будущей версии MATLAB, это будет исправлено. Повторный запуск mex -setup чтобы MATLAB перенастроил его для вас, и он работает. Начиная с R2014a, это не делает трюк.
  • в крайнем случае, вы всегда можете изменить установку MATLAB, взломав tmwtypes MATLAB.h как предлагает Деннис, но я настоятельно рекомендую не изменение установки MATLAB.

Примечание: Если вы используете C и не можете или не хотите переходить на C++, следуйте решению в этот и другие ответ, или см. альтернативный обходной путь ниже.


другое решение

если по какой-то причине вы не можете включить стандарт C++11, вы можете использовать препроцессор для определения char16_t. Либо поставить #define char16_t uint16_t до #include "mex.h", или установите его с командной строкой компилятора:

-Dchar16_t=uint16_t

можно использовать typedef, снова до в том числе мекс.h:

typedef uint16_t char16_t;

если эти решения не работают, попробуйте изменить uint16_t to UINT16_T. Далее еще, другие сообщили, что просто включая Учар.h вводит тип, но у других нет этого заголовка.


я испытал ту же ошибку, также непосредственно после обновления до Xcode 5.1.

соответствующие строки (818-824) в файле tmwtypes.h, что вызывает ошибку, являются:

#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

решение просто изменить строку

typedef char16_t CHAR16_T;

на

typedef UINT16_T CHAR16_T;

A должен признать, что я не знаю, влияет ли это на какую-либо функцию или поведение файлов mex, но, по крайней мере, я могу скомпилировать свои файлы c снова с помощью mex.


пожалуйста, увидеть другие ответы, если этот метод не работает.

я обновил компиляторы gcc / g++ с помощью homebrew до версии 4.8 --> gcc-4.8 и g++-4.8.

после этого я изменил следующие строки в mexopts.sh файл:

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

в моем mexopts.sh это линия 150. Я только добавил -std=c++11 флаг, который, я думаю, имел в виду chappjc.

EDIT: это описано в обновлении chappjc!


Я просто добавляю свой собственный эксперимент (только на C++). The

#define char16_t uint16_t 

вызывал некоторые проблемы в других частях файла mex. На самом деле, впоследствии к моему файлу mex,char16_t был правильно определен. Отслеживая цепочку includes, правильный тип char16_t находится в файле с именем __config :

typedef __char16_t char16_t;

что тоже первый файл включены из <algorithm>. Таким образом, Хак состоит в том числе algorithm до mex.h.

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

и правильное настройки выполняются, по-прежнему в многоплатформенной манере и без каких-либо изменений в конфигурации сборки.


включить Учар.h перед включением mex.ч...работать отлично. Кроме того, ответ выше (добавление-std=c++11) работает только для c++, а не c.

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

как часть XCode 5.1.1 char16_t определена в __config, который вызывается из typeinfo.

вы можете добавить

#include <typeinfo> 

до

#include "mex.h"

иметь char16_t определенными.


этот пост может помочь: http://www.seaandsailor.com/matlab-xcode6.html

Это было проще, чем я думал. Просто замените все 10.x с вашей версией OS X и добавьте -Dchar16_t=UINT16_T до CLIBS на .

он работал на OS X 10.9 Mavericks с установленным Xcode 6.