Подтвердить что ты не робот

Ошибка компиляции 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?

[Выполняется на OS 10.9.2 с версией Apple LLVM версии 5.1 (clang-503.0.38) (на основе LLVM 3.4svn)]

4b9b3361

Ответ 1

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

Быстрое исправление

Это работает для кода C или С++, но это необходимо сделать в каждой командной строке mex.

>> mex -Dchar16_t=uint16_t ...

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

Постоянное решение

Параметры:

  • Добавить -std=c++11 в 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, взломать MATLAB tmwtypes.h, как предлагает Деннис, но я настоятельно рекомендую НЕ модифицировать установку MATLAB.

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


Другой способ обхода

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

-Dchar16_t=uint16_t

В качестве альтернативы используйте typedef, еще раз включив mex.h:

typedef uint16_t char16_t;

Если эти решения не работают, попробуйте изменить uint16_t на uint16_t. Кроме того, другие сообщили, что просто включение uchar.h приводит к типу, но другие не имеют этого заголовка.

Ответ 2

Я испытал ту же ошибку, также сразу после обновления до 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.

Ответ 3

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

Я обновил свои компиляторы 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!

Ответ 4

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

#define char16_t uint16_t 

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

typedef __char16_t char16_t;

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

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

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

Ответ 5

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

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

Ответ 6

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

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

#include <typeinfo> 

до

#include "mex.h"

для определения char16_t.

Ответ 7

Это сообщение может помочь: http://www.seaandsailor.com/matlab-xcode6.html

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

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