Ошибка компиляции 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)]
Ответы
Ответ 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.